21

私はこのようないくつかの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 の断片が適切にフォーマットされているかどうかを検証する方法はありますか? DTD または XML スキームに対して xml を検証する方法はありますか?

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

たとえば、上記の xml は「&」が含まれているため正しくありません。DOCTYPE 定義文は DTD を参照していることに注意してください。

4

2 に答える 2

37

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
于 2012-12-06T11:27:34.437 に答える
8

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

ただ行う:

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

xml.parsers.expat.ExpatErrorXML が無効な場合は が返されます。

于 2012-12-06T11:27:15.413 に答える