2012-12-06 10 views
13

私はこのようないくつかのxmlの作品を持っている:サードパーティ製のライブラリなしでPythonを使用してXMLを検証する方法は?

<!DOCTYPE mensaje SYSTEM "record.dtd"> 
<record> 
    <player_birthday>1979-09-23</player_birthday> 
    <player_name>Orene Ai'i</player_name> 
    <player_team>Blues</player_team> 
    <player_id>453</player_id> 
    <player_height>170</player_height> 
    <player_position>F&W</player_position> <---- a '&' here. 
    <player_weight>75</player_weight> 
</record> 

は、XML片がよくフォーマットされているかどうかを検証する方法はありますか? xmlをDTDまたはXMLスキームに対して検証する方法はありますか?

さまざまな理由でサードパーティのパッケージは使用できません。

上記のxmlは '&'が含まれているため、矛盾しません。 DOCTYPE定義文はDTDを参照することに注意してください。

+0

トークンレベル(レベル0)でXMLに違反し、レベル1準拠をチェックするツールを見つけることを願っています。ファーストパーティのツールでは、それを見つける可能性は高くありません。私がバックトレースで正しく数えれば、jsbuenoの答えはそれに失敗します。 "&"で置き換えるのはなぜですか? – guidot

答えて

21

ElementTree(xml.etree.ElementTree.fromstring)で解析してみます。XMLがうまく構成されていないと、エラーが発生します。

>>> a = """<record> 
...  <player_birthday>1979-09-23</player_birthday> 
...  <player_name>Orene Ai'i</player_name> 
...  <player_team>Blues</player_team> 
...  <player_id>453</player_id> 
...  <player_height>170</player_height> 
...  <player_position>F&W</player_position> <---- a '&' here. 
...  <player_weight>75</player_weight> 
... </record>""" 
>>> 
>>> from xml.etree import ElementTree as ET 
>>> x = ET.fromstring(a) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib64/python2.7/xml/etree/ElementTree.py", line 1282, in XML 
    parser.feed(text) 
    File "/usr/lib64/python2.7/xml/etree/ElementTree.py", line 1624, in feed 
    self._raiseerror(v) 
    File "/usr/lib64/python2.7/xml/etree/ElementTree.py", line 1488, in _raiseerror 
    raise err 
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 7, column 24 
6

Pythonのxml.dom.minidom XMLパーサー(これは標準ライブラリにありますが、lxmlなどの代替手段ほど強力ではありません)を使用できます。

だけで実行します。

import xml.dom.minidom 
xml.dom.minidom.parseString('<My><XML><String/><XML/><My/>') 

XMLが無効である場合は、xml.parsers.expat.ExpatErrorを取得します。

+0

Minidomは、もはや標準のPythonでMXLを解析するための推奨方法ではありません(この特定のケースでは重要ではありませんが、パフォーマンスの問題がない限り)。 – jsbueno

+0

XMLのスペルを修正したい場合があります。ちなみに:今、好きな方法は何ですか? – guidot

+1

@guidot jsbuenoは、実際には「minidom」よりも強力で、実際に使用されるべきである、自分の答えに 'ElementTree'の使用を提案しました!非標準ライブラリへのアクセス権があれば、 'lxml'がおそらく最高です! –

関連する問題