2009-07-27 48 views
3

次のコードセクションに示すように、空の要素を処理するminidomパーサーには戸惑います。Pythonで空のXML要素を扱う

import xml.dom.minidom 

doc = xml.dom.minidom.parseString('<value></value>') 
print doc.firstChild.nodeValue.__repr__() 
# Out: None 
print doc.firstChild.toxml() 
# Out: <value/> 

doc = xml.dom.minidom.Document() 
v = doc.appendChild(doc.createElement('value')) 
v.appendChild(doc.createTextNode('')) 
print v.firstChild.nodeValue.__repr__() 
# Out: '' 
print doc.firstChild.toxml() 
# Out: <value></value> 

一貫した動作を得るにはどうすればよいですか? 空文字列という空要素(これはIS私は最初にXML構造に入れました)の値として受け取りたいと思います。

答えて

4

オープンxml.dom.minidomではクラッキングと「/>」を探して、私たちはこの見つける:

# Method of the Element(Node) class. 
def writexml(self, writer, indent="", addindent="", newl=""): 
    # [snip] 
    if self.childNodes: 
     writer.write(">%s"%(newl)) 
     for node in self.childNodes: 
      node.writexml(writer,indent+addindent,addindent,newl) 
     writer.write("%s</%s>%s" % (indent,self.tagName,newl)) 
    else: 
     writer.write("/>%s"%(newl)) 

のchildNodesが空のときに我々は短期終了タグのフォームにのみ発生することがこのことから推測することができますリスト。実際、これは真実であると思われる.Lloydによって指摘されているように、XML仕様では2つの間の区別はない。コードの場合、データをシリアル化する方法を再考する必要があります。

xml.dom.minidomは、コード作成が容易であるため、何か違った表示をします。ただし、一貫した出力を得ることができます。 Elementクラスを継承して、toxmlメソッドをオーバーライドして、テキストコンテンツが空でない子ノードがない場合にショートタグタグフォームを出力するようにします。次に、モジュールをMonkeypatchして新しいElementクラスを使用します。

+0

それは私のポイントです。 XML仕様では2つの形式が同等であると定義されていますが、実行時に作成された場合、minidomはを ''として扱いますが、TextElemet子ノードを持たない要素 "v"に対してはを解析します。 – Josip

+0

データのシリアライズに関する私のアプローチを変更するためにあなたの助言に従った。私はJSONを試してみたいと思います。手伝ってくれてありがとう。 – Josip

1
value = thing.firstChild.nodeValue or '' 
+0

残念ながら、これは私の問題を解決しません。私のコードでは、XML文書のTextElementにreplaceWholeTextメソッドを呼び出します。以前に空の文字列をTextElementに格納していた場合、XMLファイルが次に解析されて消えてしまい、replaceWholeTextメソッドを呼び出すことができなくなります。私はその要素がそこになければ再構築することができますが、それは非常に醜いハックになるでしょう。 – Josip

+0

「要素を再構築する」とはどういう意味ですか?存在すると、その値は単に ''の代わりにNoneになります。 –

1

Xml仕様では、これら2つのケースを区別しません。