2012-12-06 36 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'可能是最好的! –