2009-02-03 66 views
10

我有以下代码。Python xml minidom。生成<text>部分文字</text>元素

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> 

这可以轻松完成吗?

Orjanp ...

+0

我也想知道这一点,但我并不满足于接受的答案,因为使用它需要安装pxdom ... – 2010-04-18 13:17:55

+0

随着xml.dom.minidom的当前版本,即错误现在已修复 – usethedeathstar 2014-08-19 06:39:12

回答

8

可以这样很容易做到?

这取决于你想要什么确切的规则,但一般不会,你很少控制漂亮打印。如果你想要一个特定的格式,你通常必须写自己的步行者。

DOM Level 3 LS参数格式 - 漂亮打印pxdom与您的示例非常接近。它的规则是,如果一个元素只包含一个TextNode,则不会添加额外的空白。但是它(当前)使用两个空格来缩进,而不是四个。

>>> 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> 

(调整为你做任何类型的序列化的编码和输出格式。)

如果这是你想要的规则,你可以摆脱它,你可能还能够猴子-patch 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 

所有关于猴子修补不良的常见警告都适用。

+0

谢谢。因为我不会经常手动阅读这些文件,而且这不容易完成,所以我想我应该保持原样。把注意力集中到更重要的事情上,比如让这个加载/保存到xml工作。 Orjanp ... – Orjanp 2009-02-04 20:40:41

0

pyxml包通过使用xml.dom.ext.PrettyPrint()函数提供了一个简单的解决方案。它也可以打印到文件描述符。

但是不再维护pyxml包。

Oerjan佩特森

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〜”,你可能想删除它。其他交换机在那里得到格式化(对我来说)。

P.S. xmlindent是流格式,即可以按如下方式使用它:

cat myfile.xml | xmlindent > myfile_indented.xml 

所以,你也许可以用它在Python脚本没有,如果你需要写一个文件。

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> 
0

最简单的方法是使用prettyxml,并删除标签内的\ n和\ t。这样,您可以按照您的示例中的要求保留缩进。

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