парсинг .xsd в питоне - PullRequest
       4

парсинг .xsd в питоне

5 голосов
/ 21 июля 2011

Мне нужно проанализировать файл .xsd в Python, как я бы проанализировал XML.
Я использую libxml2.
Я должен разобрать xsd, который выглядит следующим образом:

<xs:complexType name="ClassType">
<xs:sequence>
    <xs:element name="IeplcHeader">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="device-number" type="xs:integer" fixed="1"/>
            </xs:sequence>
            <xs:attribute name="version" type="xs:integer" use="required" fixed="0"/>
        </xs:complexType>
    </xs:element>

когда я получаю доступ с

doc.xpathEval('//xs:complexType/xs:sequence/xs:element[@name="IeplcHeader"]'):

говорит мне, что не может найти путь.

в то время как если я удалю все xs: как следует

<complexType name="ClassType">
  <sequence>
    <element name="IeplcHeader">
        <complexType>
            <sequence>
                <element name="device-number" type="xs:integer" fixed="1"/>
            </sequence>
            <attribute name="version" type="xs:integer" use="required" fixed="0"/>
        </complexType>
    </element>

таким образом это работает

doc.xpathEval('//complexType/sequence/element[@name="IeplcHeader"]'):

Кто-нибудь знает, как я могу прочитать об этой проблеме, исправляя префикс? сейчас я готовлю файл, удаляя xs: но это ужасное решение, и я действительно надеюсь найти лучшее решение.

(я еще не пробовал с py-dom-xpath и не знаю, может ли он работать даже с xs:)

спасибо, Ste

1 Ответ

8 голосов
/ 21 июля 2011

Если вам приходится иметь дело с файлами xsd, возможно, также использовать их для проверки файлов xml, я предлагаю вам перейти к lxml , который имеет хорошую поддержку файлов XMLSchema.

пример кода:

from lxml import etree
from cStringIO import StringIO

f = StringIO()

f = StringIO('''\
 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <xsd:element name="a" type="AType"/>
 <xsd:complexType name="AType">
   <xsd:sequence>
     <xsd:element name="b" type="xsd:string" />
   </xsd:sequence>
 </xsd:complexType>
 </xsd:schema>
''')    

xmlschema_doc = etree.parse(f)

xmlschema_doc.xpath('xsd:element',
    namespaces={"xsd": "http://www.w3.org/2001/XMLSchema"})

Результат:

[<Element {http://www.w3.org/2001/XMLSchema}element at 0x9a17f2c>]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...