[python] 파이썬에서 XML 인쇄하기

파이썬에서 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))