【问题标题】:parsing .xsd in python在python中解析.xsd
【发布时间】:2011-07-21 11:48:56
【问题描述】:

我需要像解析 XML 一样在 Python 中解析文件 .xsd。
我正在使用 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 :)

谢谢, 步骤

【问题讨论】:

    标签: python xml parsing xsd


    【解决方案1】:

    如果您必须处理 xsd 文件,也许还可以使用它们来验证 xml 文件,我建议您传递给对 XMLSchema 文件有良好支持的lxml

    示例代码:

    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>]
    

    【讨论】:

    • 不错的图书馆。但我不确定它是否能满足我的需要。非常适合验证...但是此时我只需要访问 XSD 中的一些数据...这听起来很奇怪,但我正在编写一个脚本,该脚本必须从 xsd 读取一些数据...;)我马此时不使用它进行验证.. :)
    • @Stefano: lxm 不仅适用于验证,也适用于 xpath。发布一个完整的(精简的)xsd 文件进行测试会有所帮助
    猜你喜欢
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 2011-04-28
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多