10

次のようなXMLがあるとします。

 <graph label="Test" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cy="http://www.cytoscape.org" xmlns="http://www.cs.rpi.edu/XGMML"  directed="1">
    <foo>...</foo>
 </graph>

すべての属性を持つ最初の要素名はすべて1行に表示されます。

lxmlを使用して、次のようなコードで要素ツリーをきれいに印刷する方法を見てきました。

from lxml import etree
 ...
def prettyPrintXml(filePath):
    assert filePath is not None
    parser = etree.XMLParser(resolve_entities=False, remove_blank_text=True, 
                             strip_cdata=False)
    document = etree.parse(filePath, parser)
    print(etree.tostring(document, pretty_print=True, encoding='utf-8'))

...しかし、それを使用すると、すべての要素が1行に表示されます。

たとえば、行の長さが80文字を超えないように、要素属性の間に改行を挿入するようにきれいなプリンターに指示する魔法の呪文はありますか?

結果を次のようにしたいと思います。

<graph label="Test"
       xmlns:dc="http://purl.org/dc/elements/1.1/"
       xmlns:xlink="http://www.w3.org/1999/xlink"
       xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
       xmlns:cy="http://www.cytoscape.org"
       xmlns="http://www.cs.rpi.edu/XGMML"  directed="1">
  <foo>...</foo>
</graph>

subprocessps:私は頼りたくないxmllint

4

1 に答える 1

3

lxmlかなりの印刷機能が組み込まれています。これは、 xmlを印刷するいくつかの方法を説明するチュートリアルです。ただし、いくつかの制限があります(lxmlによると、xml仕様の制限)。

このstackoverflowの質問には、xmlをきれいに印刷するための多かれ少なかれハッキーなソリューションを含むいくつかの回答があり、ニーズに合わせて少なくともregexpベースの回答をモデル化できると思います。

ElementTreeで有名な) Fredrik Lundhは、 xmlを印刷するための非常に低レベルの説明を持っています。これは、改行属性とインデント属性にカスタマイズすることもできます。

于 2013-03-01T10:41:01.687 に答える