Как проверить 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.

Ответ 1

Просто попробуйте проанализировать его с помощью 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

Ответ 2

Вы можете использовать python xml.dom.minidom XML-парсер (который находится в стандартной библиотеке, но не такой мощный, как альтернативы, такие как lxml).

Просто делать:

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

Вы получите xml.parsers.expat.ExpatError если XML недействителен.