在Python中解析.xsd

6 投票
1 回答
18082 浏览
提问于 2025-04-16 21:59

我需要在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>

当我用下面的方式访问时

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 个回答

9

如果你需要处理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>]

撰写回答