2017-12-13 6 views
2

Python 2.7.6에서 lxml 4.1.1로 XML 파일을 읽고, 수정하고 작성하려고합니다.Python lxml에서 XML pretty print가 실패했습니다

내 코드 :

<a> 
    <b/> 
</a> 

를 그리고 생성 된 출력 파일 out.xml :

<a> 
    <b><c></c></b> 
</a> 

또는 내가 remove_blank_text=True을 설정할 때 :

import lxml.etree as et 

fn_xml_in = 'in.xml' 
parser = et.XMLParser(remove_blank_text=True) 
xml_doc = et.parse(fn_xml_in, parser) 
xml_doc.getroot().find('b').append(et.Element('c')) 
xml_doc.write('out.xml', method='html', pretty_print=True) 

입력 파일 in.xml은 다음과 같습니다

<a><b><c></c></b></a> 
I가 b 요소 내의 줄 바꿈을 삽입하는 LXML 및 들여 쓰기를 기대했을 것이다

:

<a> 
    <b> 
     <c></c> 
    </b> 
</a> 

가 어떻게 이것을 달성 할 수 있습니까?

tidy LIB 래퍼를 시도했다, 그러나 그들은 HTML에 오히려 XML보다 전문 보인다.

줄 바꿈 문자를 btail으로 추가하려고했으나 들여 쓰기가 깨졌습니다.

편집 :c 요소를 여는 데 분리하여 유지하려면 닫음 태그 <c></c>이 필요합니다. 이것이 예에서 method='HTML'을 사용하는 이유입니다. mzjn의 의견에

+1

제거'방법 = 'html'' 또는 사용'방법 ='xml''. – mzjn

+0

감사합니다, 이것은 적절한 해결책을 향해 나를 가리켰다! –

답변

2

는 "XML"출력 방법을 사용합니다.

c 요소의 text 속성을 빈 문자열로 설정하여 요소가 <c></c>으로 serialize되도록하십시오.

코드 :

import lxml.etree as et 

parser = et.XMLParser(remove_blank_text=True) 
xml_doc = et.parse('in.xml', parser) 

b = xml_doc.getroot().find('b') 
c = et.Element('c') 
c.text='' 
b.append(c) 

xml_doc.write('out.xml', pretty_print=True) 

결과 (out.xml) :

<a> 
    <b> 
    <c></c> 
    </b> 
</a> 
0

덕분에, 나는 작업 –하지만 우아한 – 솔루션을 발견했다. HTML 구문으로 유지하려면 빈 요소가 필요하기 때문에 method='XML'을 사용하는 것은 만족스럽지 않습니다.

import lxml.etree as et 

parser = et.XMLParser(remove_blank_text=True) 
xml_doc = et.parse('in.xml', parser) 
xml_doc.getroot().find('b').append(et.Element('c')) 
xml_doc.write('out.xml', pretty_print=True) 

parser = et.XMLParser(remove_blank_text=False) 
xml_doc = et.parse('out.xml', parser) 
xml_doc.write('out.xml', pretty_print=True, method='HTML') 

결과 :

<a> 
    <b> 
    <c></c> 
    </b> 
</a> 

우아한 아니지만, 작업 문서 포맷

두 번 원하는 결과를 얻을 수 있습니다. 작성할 때 (즉, 기본의 명시 적으로 부여하지 않도록)

+1

문서를 두 번 파싱하는 대신에'c' 엘리먼트의'text' 속성을 빈 문자열로 설정할 수 있습니다.그러면 요소가 ''으로 직렬화됩니다. https://stackoverflow.com/a/19548368/407651을 참조하십시오. – mzjn

+0

멋진! 빈 문자열과 전혀 다른 것의 차이. 의견을 답변으로 바꾸시겠습니까? 나는 너보다 내 것을 받아 들일 것이다. –

관련 문제