2014-01-15 48 views
0

我對Python很陌生,只能讀到Learn Python the Hard Way。但我認爲這仍然超出我的範圍。我的技能是使用XML/XSL,而不是Python。我需要一點幫助才能開始。將XML數據從XML文件添加到現有XML文件

概述:我需要將缺失的XML數據(addition.xml)添加到現有XML文件(original.xml)中。

XML文件(與該缺少的數據):(addition.xml)以上

<profile> 
    <dog-list> 
     <dog> 
      <name>sally</dog> 
      <age>1</age> 
     </dog> 
     <dog> 
      <name>susie</dog> 
      <age>12</age> 
     </dog> 
    </dog-list> 
    <people-list> 
     <person> 
      <name>ue</name> 
      <age>25</age> 
      <gender>female</gender> 
     </person> 
    </people-list> 
</profile> 

XML數據添加到這個XML文件:(original.xml)

<profile> 
    <cat-list> 
     <cat> 
      <name>foo></name> 
     </cat> 
     <cat> 
      <name>bar</name> 
      <age>3</age> 
     </cat> 
    </cat-list> 
    <bird-list> 
     <bird> 
      <name>cricket</name> 
      <age>2</age> 
     </bird> 
    </bird-list> 
    <people-list> 
     <person> 
      <name>tyler</name> 
      <age>26</age> 
     </person> 
    </people-list> 
    <car-list> 
     <car> 
      <make>mitsubishi</make> 
      <model>evo x</model> 
      <year>2013</year> 
     </car> 
    </car-list> 
</profile> 

我的預期輸出應該是: - > new(original.xml)

<profile> 
    <cat-list> 
     <cat> 
      <name>foo></name> 
     </cat> 
     <cat> 
      <name>bar</name> 
      <age>3</age> 
     </cat> 
    </cat-list> 
    <dog-list> 
     <dog> 
      <name>sally</dog> 
      <age>1</age> 
     </dog> 
     <dog> 
      <name>susie</dog> 
      <age>12</age> 
     </dog> 
    </dog-list> 
    <bird-list> 
     <bird> 
      <name>cricket</name> 
      <age>2</age> 
     </bird> 
    </bird-list> 
    <people-list> 
     <person> 
      <name>tyler</name> 
      <age>26</age> 
     </person> 
     <person> 
      <name>ue</name> 
      <age>25</age> 
      <gender>female</gender> 
     </person> 
    </people-list> 
    <car-list> 
     <car> 
      <make>mitsubishi</make> 
      <model>evo x</model> 
      <year>2013</year> 
     </car> 
    </car-list> 
</profile> 

這裏發生的情況是,original.xml文件中缺少addition.xml中的數據。我如何着手將addition.xml中的數據添加到original.xml中,而不是創建一個新文件並覆蓋它。

我看遍了谷歌和stackoverflow。我知道我可以使用ElementTree,但是我有如何創建這個結果的模糊想法。

任何幫助,非常感謝!

+0

XML數據是無效的:看不匹配的開始和結束標記。 – alecxe

+0

固定。對不起,我輸入了,並錯過了結束標記'' – misterbear

+0

元素的順序是否相關? ''必須在''之後出現嗎? –

回答

1

您的要求不允許使用通用合併程序(例如您鏈接的程序),但是這裏有一個可能適用於您的程序。

用法:./program.py original.xml addition.xml

#! /usr/bin/python2 

import sys 
from lxml import etree 

result = etree.Element('root') 
parser = etree.XMLParser(remove_blank_text=True) 

# Add each file to the tree 
for xmlfile in sys.argv[1:]: 
    with open(xmlfile) as xmlfile: 
    btree = etree.parse(xmlfile, parser) 
    # Ensure that the resulting tree has the right root 
    result.tag = btree.getroot().tag 
    # Consider each 2nd-level item 
    for bchild in btree.xpath("/*/*"): 
    tags = result.xpath("./%s"%bchild.tag) 
    if len(tags) == 0: 
     # Add <dog-list>, for example 
     #print "adding %s to %s"%(bchild.tag, result.tag) 
     result.append(bchild) 
    else: 
     for bgrandchild in bchild: 
     # add <dog>, for example 
     #print "adding %s to %s"%(bgrandchild.tag, tags[0].tag) 
     tags[0].append(bgrandchild) 

with open("output.xml", "w") as output: 
    output.write(etree.tostring(result, pretty_print = True))