在python中解析.xsd

Ste*_*ano 5 python xml parsing xsd

我需要在Python中解析文件.xsd,因为我将解析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>
Run Code Online (Sandbox Code Playgroud)

当我访问

doc.xpathEval('//xs:complexType/xs:sequence/xs:element[@name="IeplcHeader"]'):
Run Code Online (Sandbox Code Playgroud)

告诉我,找不到路径.

如果我删除所有的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>
Run Code Online (Sandbox Code Playgroud)

以这种方式它的工作原理

doc.xpathEval('//complexType/sequence/element[@name="IeplcHeader"]'):
Run Code Online (Sandbox Code Playgroud)

有谁知道我怎么能读到修复前缀这个问题?现在我正在准备删除xs的文件:但这是一个糟糕的解决方案,我真的希望能够找到更好的解决方案.

(我没有尝试使用py-dom-xpath,我不知道是否可以使用xs :)

谢谢,ste

neu*_*ino 8

如果你必须处理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"})
Run Code Online (Sandbox Code Playgroud)

结果是:

[<Element {http://www.w3.org/2001/XMLSchema}element at 0x9a17f2c>]
Run Code Online (Sandbox Code Playgroud)

  • @Stefano:`lxm`不仅适用于验证,也适用于`xpath`.发布一个完整的(剥离的)xsd文件来进行测试会有所帮助 (2认同)