2014-12-11 1 views
0

처리 된 데이터를 XML로 작성하기 전에 결과 XML 문서에서 모두 멋지게 표시되도록 일부 형식을 지정합니다.ElementTree.tostring 메서드로 추가 한 xml 헤더를 제거하는 방법이 있습니까?

import xml.etree.ElementTree as et 
import xml.dom.minidom as mdom 
(...) 

for i in range(10): 
    root = et.Element("main") 
    (...) 

    ugly_xml = et.tostring(root, 'utf-8', method='xml') 
    parsed_xml = mdom.parseString(ugly_xml) 
    nice_xml = parsed_xml.toprettyxml(indent=" " * 3) 
    with open('test.xml', 'a') as f: 
     f.write(nice_xml) 

그러나 결과 파일에는 분명히 중복 된 xml 헤더가 있습니다.

<?xml version="1.0" ?> 
(...) 
<?xml version="1.0" ?> 
(...) 
<?xml version="1.0" ?> 

tostring 메서드로 xml 헤더를 인쇄하지 않는 방법이 있습니까? 문서는 'html'또는 'text'와 같은 여러 유형을 시도 할 수 있다는 것을 제외하고는 어떤 정보도 제공하지 않았습니다. 그냥 원하는 경우

답변

1

꽤 그것은 최대의 ElementTree 작성자는 문서에 공백을 삽입하는 function 다음 (예 추가)를 제안합니다 :

from xml.etree import ElementTree as et 

def indent(elem, level=0): 
    i = "\n" + level*" " 
    if len(elem): 
     if not elem.text or not elem.text.strip(): 
      elem.text = i + " " 
     if not elem.tail or not elem.tail.strip(): 
      elem.tail = i 
     for elem in elem: 
      indent(elem, level+1) 
     if not elem.tail or not elem.tail.strip(): 
      elem.tail = i 
    else: 
     if level and (not elem.tail or not elem.tail.strip()): 
      elem.tail = i 

m = et.Element(u'main') 
s1 = et.SubElement(m,u'sub1') 
s2 = et.SubElement(s1,u'sub2') 
s2.text = u'马克' 

print et.tostring(m,'utf-8') 
indent(m) 
print et.tostring(m,'utf-8') 

출력 :

<main><sub1><sub2>马克</sub2></sub1></main> 
<main> 
    <sub1> 
    <sub2>马克</sub2> 
    </sub1> 
</main> 

et.tostring을 그 자체가 헤더를 추가하지 않았습니다.

+0

나는 큰 파일을 처리 할 필요가 이후의 성능에 영향을 미칠 두려워 ... 비 표준화 된 방법으로 행동 tostringlist에 의존 수 있도록하려고합니다. 매 반복마다이 함수를 실행하면 값이 비쌀 수 있습니다. – minerals

1

'utf8'인코딩이 필요 하신가요?

"".join(ET.tostringlist(m, encoding='utf8', method='xml')[1:])) 

을하지만이

관련 문제