2010-05-29 48 views
6

使用Python的股票XML工具時如xml.dom.minidom對XML編寫,一個文件總是開始像如何在Python中編寫無頭文件的XML文件?

<?xml version="1.0"?>

[...]

雖然這是完全合法的XML代碼,它甚至建議使用標題,我想擺脫它,因爲我正在使用的程序之一在這裏有問題。

我似乎無法找到合適的選項xml.dom.minidom,所以我想知道是否有其他軟件包允許忽略標題。

乾杯,

尼科

+0

您可以隨時寫入一個StringIO對象,剝離標題並保存它。這可能比挑選一個新庫更容易。 http://docs.python.org/library/stringio.html – msw 2010-05-29 00:54:41

回答

13

不幸的是,minidom不允許您選擇省略XML聲明。

但是,您始終可以通過在文檔的根元素上調用toxml()而不是document來自行序列化文檔內容。然後,你不會得到一個XML聲明:

xml= document.documentElement.toxml('utf-8') 

...但你也不會得到別的根元素外,如DOCTYPE,或有任何意見或處理指令。如果需要的話,由一個序列化的文檔對象之一每個孩子

xml= '\n'.join(node.toxml('utf-8') for node in document.childNodes) 

我想,如果有哪個做不容忽視的頭包等。

DOM Level 3的LS defines你可以用它來抑制它的xml-declaration配置參數。我所知道的唯一的Python實現是pxdom,它在標準支持方面是全面的,但並不快。

+1

爲了記錄,LXML和Python 2.7 ElementTree API接受'.write()'上的'xml_declaration = False',並且LXML和cElementTree都非常快。 – ssokolow 2010-08-31 05:40:20

+0

2018年的一些消息「無xml聲明」? XML在Python中似乎被放棄了......用Java代替? PS:[none here](https://docs.python.org/3/library/xml.dom.minidom.html)。 – 2018-01-30 09:18:53

0

純粹主義者可能不喜歡聽到這些,但我一直在使用XML解析器來生成XML是大材小用發現。直接以字符串形式生成它。這也可以讓你生成比你可以保存在內存中更大的文件,這是你不能用DOM做的。閱讀XML是另一回事。

+3

這充滿了陷阱。序列化XML比解析它容易,但它仍然需要相當小心才能正確使用。像屬性值中的空格轉義(在解析時避免標準化),']]'問題,分割CDATA節(特別是如果您需要非UTF-8輸出時),尤其是命名空間DOM序列化的複雜性。你會*犯錯,併產生一些不是格式良好的XML。然後所有卑劣的孩子都會笑。 – bobince 2010-05-29 01:31:59

0

如果您使用minidom設置,只需掃描文件並在寫完所有需要的XML後刪除第一行。

0

你也許能夠使用自定義的文件對象,它消除了第一個標籤,e.g:

class RemoveFirstLine: 
    def __init__(self, f): 
     self.f = f 
     self.xmlTagFound = False 

    def __getattr__(self, attr): 
     return getattr(self, self.f) 

    def write(self, s): 
     if not self.xmlTagFound: 
      x = 0 # just to be safe 
      for x, c in enumerate(s): 
       if c == '>': 
        self.xmlTagFound = True 
        break 
      self.f.write(s[x+1:]) 
     else: 
      self.f.write(s) 

... 
f = RemoveFirstLine(open('path', 'wb')) 
Node.writexml(f, encoding='UTF-8') 

或類似的東西。這具有如下優點:如果XML文件相當大,則文件不必完全重寫。

5

如果你想使用minidom命名和維護「可愛」,這個怎麼樣作爲一個快速/哈克修復:

xml_without_declaration。py

import xml.dom.minidom as xml 

doc = xml.Document() 

declaration = doc.toxml() 

a = doc.createElement("A") 
doc.appendChild(a) 
b = doc.createElement("B") 
a.appendChild(b) 

xml = doc.toprettyxml()[len(declaration):] 

print xml 
+0

這會在字符串的開始處留下新的一行。用'xml = doc.toprettyxml()[(len(declaration)+ 1):]'修復。 – 2014-10-23 02:07:20