2012-12-06 67 views
13

我有一些XML片段是這樣的:如何驗證xml使用python沒有第三方庫?

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

我認爲它有違冒險,違反了令牌級別(level-0)上的XML,並希望找到一個工具來檢查一級合規性。第一方工具中找到的概率不高。如果我在回溯中正確計數,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.parsers.expat.ExpatError如果XML是無效的。

+0

Minidom不再是在標準Python中解析MXL的首選方式(儘管在這種特殊情況下它不會有影響,除非性能很重要) – jsbueno

+0

您可能需要更正XML拼寫;順便說一下:現在最喜歡的方式是什麼? – guidot

+1

@guidot jsbueno建議在他自己的答案中使用'ElementTree',它實際上比'minidom'更強大,應該可以使用!如果你有權訪問非標準庫,'lxml'可能是最好的! –