2009-02-03 18 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