2016-11-25 8 views
1

파이썬의 etree 라이브러리로 XML 파일을 생성하고 있습니다. 생성 된 파일의 한 노드는 기존 XML 파일에서 읽습니다. 이 요소를 추가하면 앞과 뒤의 노드에 대한 pretty_print가 손상됩니다. 이 결과 제공파일에서 읽은 xml-node를 추가하면 인접한 노드에 대해 pretty_print가 실행됩니다.

import xml.etree.cElementTree as ET 
from lxml import etree 

root = etree.Element("startNode") 
subnode1 = etree.SubElement(root, "SubNode1") 
subnode1Child1 = etree.SubElement(subnode1, "subNode1Child1") 
etree.SubElement(subnode1Child1, "Child1") 
etree.SubElement(subnode1Child1, "Child2") 

f = open('/xml_testdata/ext_file.xml','r') 
ext_xml = etree.fromstring(f.read()) 
ext_subnode = ext_xml.find("ExtNode") 
subnode1.append(ext_subnode) 

subnode1Child2 = etree.SubElement(subnode1, "subNode1Child2") 
etree.SubElement(subnode1Child2, "Child1") 
etree.SubElement(subnode1Child2, "Child2") 

tree = etree.ElementTree(root) 
tree.write("testfile.xml", xml_declaration=True, pretty_print=True) 

: 매우 읽을 수

<startNode> 
    <SubNode1><subNode1Child1><Child1/><Child2/></subNode1Child1><ExtNode> 
      <NodeFromExt> 
       <SubNodeFromExt1/> 
      </NodeFromExt> 
      <NodeFromExt> 
       <SubNodeFromExt2/> 
       <AnotherSubNodeFromExt2> 
        <SubSubNode/> 
        <AllPrettyHere> 
         <Child/> 
        </AllPrettyHere> 
       </AnotherSubNodeFromExt2> 
      </NodeFromExt> 
    </ExtNode> 
    <subNode1Child2><Child1/><Child2/></subNode1Child2></SubNode1> 
</startNode> 

아니, 그것은 무엇입니까? "subNodeChild"가이 예제보다 훨씬 많은 하위 노드를 포함하는 경우 더욱 악화됩니다! 외부 요소를 추가하지 않고

, 그것은 다음과 같습니다

<startNode> 
    <SubNode1> 
    <subNode1Child1> 
     <Child1/> 
     <Child2/> 
    </subNode1Child1> 
    <subNode1Child2> 
     <Child1/> 
     <Child2/> 
    </subNode1Child2> 
    </SubNode1> 
</startNode> 

가 그래서 문제가 발생 외부 요소를 추가하여!

pretty_print-output을 깨지 않고 외부 요소를 추가 할 수 있습니까?

답변

1

기존 XML 파일을 구문 분석 할 때 무시할 수있는 공백을 제거하는 구문 분석기 개체를 사용하면 더 멋진 출력물을 얻을 수 있습니다. 대신이의

:

f = open('/xml_testdata/ext_file.xml','r') 
ext_xml = etree.fromstring(f.read()) 

사용이 : 또한

f = open('/xml_testdata/ext_file.xml', 'r') 
parser = etree.XMLParser(remove_blank_text=True) 
ext_xml = etree.fromstring(f.read(), parser) 

참조 :

+1

그런데'etree.fromstring (f.read(), parser)'대신'etree.parse ('/ xml_testdata/ext_file.xml', 파서)'를 사용할 수 있습니다. – mzjn

0

나는 다소 etree.SubElement와 "ExtNode"을 만들고 그 안에 요소를 추가하여 효과를 완화 할 수있었습니다 :

<startNode> 
    <SubNode1> 
    <subNode1Child1> 
     <Child1/> 
     <Child2/> 
    </subNode1Child1> 
    <ExtNode><NodeFromExt> 
     <SubNodeFromExt1/> 
     </NodeFromExt> 
    <NodeFromExt> 
     <SubNodeFromExt2/> 
     <AnotherSubNodeFromExt2> 
      <SubSubNode/> 
      <AllPrettyHere> 
      <Child/> 
      </AllPrettyHere> 
     </AnotherSubNodeFromExt2> 
    </NodeFromExt> 
    </ExtNode> 
    <subNode1Child2> 
     <Child1/> 
     <Child2/> 
    </subNode1Child2> 
    </SubNode1> 
</startNode> 

되지 않음 :이 결과를 가지고

ext_node = etree.SubElement(subnode1, "ExtNode") 
for element in ext_xml.findall("ExtNode/NodeFromExt") 
    ext_node.append(element) 

을 완벽하지만 적어도 사람이 읽을 수있는 것 (pretty_print의 전체 요점은 무엇입니까?)

내 강박증을 만족시키기 위해 나는 flawles를 얻을 수있는 방법이 있다면 여전히 관심을 가질 것입니다. 교활한 형식의 파일!