13

次のコードがあります。

from xml.dom.minidom import Document

doc = Document()

root = doc.createElement('root')
doc.appendChild(root)
main = doc.createElement('Text')
root.appendChild(main)

text = doc.createTextNode('Some text here')
main.appendChild(text)

print doc.toprettyxml(indent='\t')

結果は次のとおりです。

<?xml version="1.0" ?>
<root>
    <Text>
        Some text here
    </Text>
</root>

これはすべてうまくいきますが、出力を次のようにしたい場合はどうすればよいでしょうか?

<?xml version="1.0" ?>
<root>
    <Text>Some text here</Text>
</root>

これは簡単にできますか?

オルジャンプ...

4

6 に答える 6

7

これは簡単にできますか?

必要な正確なルールによって異なりますが、一般的にいいえ、きれいな印刷をほとんど制御できません。特定の形式が必要な場合は、通常、独自の walker を作成する必要があります。

pxdomの DOM レベル 3 LS パラメータ format-pretty-print は、あなたの例にかなり近いものです。そのルールは、要素に含まれる TextNode が 1 つだけの場合、余分な空白は追加されないというものです。ただし、(現在) インデントに 4 つではなく 2 つのスペースを使用しています。

>>> doc= pxdom.parseString('<a><b>c</b></a>')
>>> doc.domConfig.setParameter('format-pretty-print', True)
>>> print doc.pxdomContent
<?xml version="1.0" encoding="utf-16"?>
<a>
  <b>c</b>
</a>

(実行しているシリアライゼーションのタイプに合わせてエンコーディングと出力形式を調整します。)

それがあなたが望むルールであり、それを回避できる場合は、minidom の Element.writexml にモンキー パッチを適用することもできます。

>>> from xml.dom import minidom
>>> def newwritexml(self, writer, indent= '', addindent= '', newl= ''):
...     if len(self.childNodes)==1 and self.firstChild.nodeType==3:
...         writer.write(indent)
...         self.oldwritexml(writer) # cancel extra whitespace
...         writer.write(newl)
...     else:
...         self.oldwritexml(writer, indent, addindent, newl)
... 
>>> minidom.Element.oldwritexml= minidom.Element.writexml
>>> minidom.Element.writexml= newwritexml

モンキー パッチの悪さに関する通常の警告がすべて適用されます。

于 2009-02-03T15:30:32.183 に答える
2

私はまったく同じものを探していました、そして私はこのポストに出くわしました。(xml.dom.minidomで提供されるインデントは、XMLを操作するために使用していた別のツールを壊し、インデントする必要がありました)少し複雑な例で受け入れられたソリューションを試しましたが、これが結果でした:

In [1]: import pxdom

In [2]: xml = '<a><b>fda</b><c><b>fdsa</b></c></a>'

In [3]: doc = pxdom.parseString(xml)

In [4]: doc.domConfig.setParameter('format-pretty-print', True)

In [5]: print doc.pxdomContent
<?xml version="1.0" encoding="utf-16"?>
<a>
  <b>fda</b><c>
    <b>fdsa</b>
  </c>
</a>

きれいに印刷されたXMLは正しくフォーマットされておらず、モンキーパッチについてはあまり満足していません(つまり、それが何を意味するのかほとんどわからず、悪いことを理解しています)。そこで、別の解決策を探しました。

出力をファイルに書き込んでいるので、Ubuntu用のxmlindentプログラム($ sudo aptitude install xmlindent)を使用できます。したがって、フォーマットされていないファイルをファイルに書き込んでから、Pythonプログラム内からxmlindentを呼び出します。

from subprocess import Popen, PIPE
Popen(["xmlindent", "-i", "2", "-w", "-f", "-nbe", file_name], 
      stderr=PIPE, 
      stdout=PIPE).communicate()

-wスイッチを指定すると、ファイルが上書きされますが、「myfile.xml〜」などの名前が付けられたままになります。これはおそらく削除する必要があります。他のスイッチは、フォーマットを正しくするためにあります(私にとって)。

PS xmlindentはストリームフォーマッタです。つまり、次のように使用できます。

cat myfile.xml | xmlindent > myfile_indented.xml

したがって、必要に応じて、ファイルに書き込むことなくPythonスクリプトで使用できる可能性があります。

于 2009-08-19T19:58:11.553 に答える
1

これは toxml() で行うことができ、正規表現を使用して物事を整理します。

>>> from xml.dom.minidom import Document
>>> import re
>>> doc = Document()
>>> root = doc.createElement('root')
>>> _ = doc.appendChild(root)
>>> main = doc.createElement('Text')
>>> _ = root.appendChild(main)
>>> text = doc.createTextNode('Some text here')
>>> _ = main.appendChild(text)
>>> out = doc.toxml()
>>> niceOut = re.sub(r'><', r'>\n<', re.sub(r'(<\/.*?>)', r'\1\n', out))
>>> print niceOut
<?xml version="1.0" ?>
<root>
<Text>Some text here</Text>
</root>
于 2012-08-27T16:43:31.887 に答える
0

これを行う最も簡単な方法は、prettyxml を使用して、タグ内の \n と \t を削除することです。そうすれば、例で必要なようにインデントを維持できます。

xml_output = doc.toprettyxml() nojunkintags = re.sub('>(\n|\t)</', '', xml_output) print nojunkintags

于 2015-04-07T13:51:20.917 に答える
0

このソリューションは、モンキーパッチを適用したり、ミニダムの使用をやめたりすることなく、私にとってはうまくいきました。

from xml.dom.ext import PrettyPrint
from StringIO import StringIO

def toprettyxml_fixed (node, encoding='utf-8'):
    tmpStream = StringIO()
    PrettyPrint(node, stream=tmpStream, encoding=encoding)
    return tmpStream.getvalue()

http://ronrothman.com/public/leftbraned/xml-dom-minidom-toprettyxml-and-silly-whitespace/#best-solution

于 2010-03-25T16:18:07.500 に答える
0

pyxml パッケージは、xml.dom.ext.PrettyPrint() 関数を使用して、これに対する簡単なソリューションを提供します。ファイル記述子に出力することもできます。

ただし、pyxml パッケージはメンテナンスされなくなりました。

エルヤン・ペッターセン

于 2009-03-08T16:48:22.527 に答える