我正在用 Python 解析 XML。我有一个 XSD 架构来验证 XML。我能否获得 XSD 中定义的 XML 特定节点的类型?
比如我的XML(小部分)是
<deviceDescription>
<wakeupNote>
<lang xml:lang="ru">Русский</lang>
<lang xml:lang="en">English</lang>
</wakeupNote>
</deviceDescription>
我的 XSD 是(又是其中的一小部分):
<xsd:element name="deviceDescription" type="zwv:deviceDescription" minOccurs="0"/>
<xsd:complexType name="deviceDescription">
<xsd:sequence>
<xsd:element name="wakeupNote" type="zwv:description" minOccurs="0">
<xsd:unique name="langDescrUnique">
<xsd:selector xpath="zwv:lang"/>
<xsd:field xpath="@xml:lang"/>
</xsd:unique>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="description">
<xsd:sequence>
<xsd:element name="lang" maxOccurs="unbounded">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute ref="xml:lang" use="required"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
在解析期间,我想知道我的标记 wakeupNote 在 XSD 中定义为 complexType zwv:description。如何做到这一点(在 Python 中)?
我需要这个做什么?假设我有很多这样的 XML,我想检查它们是否都有填充英语的字段。很容易检查 <lang xml:lang="en"></lang>
为空,但允许完全不指定此标签。
所以想法是获取所有可能具有语言描述的标签并检查<lang>
标签存在并且具有非空内容 en。
更新
因为在验证期间我的 XML 是根据 XSD 检查的,所以验证引擎知道所有节点的类型。 7 个月前我有一个类似的问题,但仍然没有答案。他们是相关的,恕我直言。 Validating and filling default values in XML based on XSD in Python
最佳答案
如果问题是:如何找到给定 XML 节点的类型名称? 答案是使用 xpath in python查找它。在 xsd 上运行的 xpath 将是
//element[@name='wakeupNote']/@type
这应该返回 zwv:description。如果它返回两种类型,你将不得不从根开始
/root/foo/wakeupNote (type A)
/root/bar/wakeupNote (type B)
从根部往下走会很乏味。您必须同时查找匿名类型和命名类型。
如果问题是:如何找到给定类型的所有 XML 节点? 如果 schema 会经常变化,您可以在使用上述方法解析它时测试每个节点的类型。
如果模式是众所周知的、固定的,并且您正在寻找的节点可以使用 XPATH 找到,那么您可以测试每个节点。
//@xml:lang='en'
然后用python检查每一个的长度。
在稳定模式的情况下,您可以编写第二个 XSD 来强制执行您正在寻找的标准。
关于python - 是否可以获取 XSD 中定义的 XML 节点类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4799838/