2014-01-15 2 views
0

저는 Python을 처음 사용하여 Learn Python the Hard Way 만 읽습니다. 그러나 나는 이것이 여전히 나의 영역에서 벗어나는 것이라고 생각한다. 내 기술은 파이썬이 아니라 XML/XSL에있다. 시작하려면 약간의 도움이 필요합니다.XML 파일의 XML 데이터를 기존 XML 파일에 추가

개요 : 누락 된 XML 데이터 (adds.xml)를 기존 XML 파일 (original.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> 
(누락 된 데이터)

XML 파일

내 예상 출력은 다음과 같아야합니다. -> the 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> 

여기서 일어나는 일은 addition.xml의 데이터가 original.xml 파일에 없다는 것입니다. 새 파일을 작성하지 않고, 겹쳐 쓰는 대신에, adds.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))