파이썬에서 XML을 예쁘게 인쇄하는 가장 좋은 방법은 무엇입니까?
답변
import xml.dom.minidom
dom = xml.dom.minidom.parse(xml_fname) # or xml.dom.minidom.parseString(xml_string)
pretty_xml_as_string = dom.toprettyxml()
답변
lxml은 최근에 업데이트되었으며, 예쁜 인쇄 기능을 포함합니다
import lxml.etree as etree
x = etree.parse("filename")
print etree.tostring(x, pretty_print=True)
lxml 튜토리얼을 확인하십시오 :
http://lxml.de/tutorial.html
답변
또 다른 해결책은 2.5 이후 파이썬에 내장 된 ElementTree 라이브러리와 함께 사용하기 위해이 indent
함수 를 빌리는 것 입니다. 그 모습은 다음과 같습니다.
from xml.etree import ElementTree
def indent(elem, level=0):
i = "\n" + level*" "
j = "\n" + (level-1)*" "
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 subelem in elem:
indent(subelem, level+1)
if not elem.tail or not elem.tail.strip():
elem.tail = j
else:
if level and (not elem.tail or not elem.tail.strip()):
elem.tail = j
return elem
root = ElementTree.parse('/tmp/xmlfile').getroot()
indent(root)
ElementTree.dump(root)
답변
추악한 텍스트 노드 문제를 해결하는 내 (해키?) 솔루션이 있습니다.
uglyXml = doc.toprettyxml(indent=' ')
text_re = re.compile('>\n\s+([^<>\s].*?)\n\s+</', re.DOTALL)
prettyXml = text_re.sub('>\g<1></', uglyXml)
print prettyXml
위의 코드는 다음을 생성합니다.
<?xml version="1.0" ?>
<issues>
<issue>
<id>1</id>
<title>Add Visual Studio 2005 and 2008 solution files</title>
<details>We need Visual Studio 2005/2008 project files for Windows.</details>
</issue>
</issues>
이 대신에 :
<?xml version="1.0" ?>
<issues>
<issue>
<id>
1
</id>
<title>
Add Visual Studio 2005 and 2008 solution files
</title>
<details>
We need Visual Studio 2005/2008 project files for Windows.
</details>
</issue>
</issues>
면책 조항 : 아마도 몇 가지 제한 사항이 있습니다.
답변
다른 사람들이 지적했듯이 lxml에는 예쁜 프린터가 내장되어 있습니다.
기본적으로 CDATA 섹션을 일반 텍스트로 변경하므로 결과가 불쾌 할 수 있습니다.
다음은 입력 파일을 유지하고 들여 쓰기 만 변경하는 Python 함수입니다 ( strip_cdata=False
). 또한 출력에서 기본 ASCII 대신 UTF-8을 인코딩으로 사용하는지 확인하십시오 ( encoding='utf-8'
).
from lxml import etree
def prettyPrintXml(xmlFilePathToPrettyPrint):
assert xmlFilePathToPrettyPrint is not None
parser = etree.XMLParser(resolve_entities=False, strip_cdata=False)
document = etree.parse(xmlFilePathToPrettyPrint, parser)
document.write(xmlFilePathToPrettyPrint, pretty_print=True, encoding='utf-8')
사용법 예 :
prettyPrintXml('some_folder/some_file.xml')
답변
BeautifulSoup에는 사용하기 쉬운 prettify()
방법이 있습니다.
들여 쓰기 레벨 당 하나의 공간을 들여 쓰기합니다. lxml의 pretty_print보다 훨씬 잘 작동하며 짧고 달콤합니다.
from bs4 import BeautifulSoup
bs = BeautifulSoup(open(xml_file), 'xml')
print bs.prettify()
답변
당신이 경우 xmllint
당신은 하위 프로세스를 생성하고 사용할 수 있습니다.xmllint --format <file>
입력 XML을 표준 출력으로 출력합니다.
이 방법은 파이썬 외부의 프로그램을 사용하므로 일종의 해킹이됩니다.
def pretty_print_xml(xml):
proc = subprocess.Popen(
['xmllint', '--format', '/dev/stdin'],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
)
(output, error_output) = proc.communicate(xml);
return output
print(pretty_print_xml(data))