python - 是否可以获取 XSD 中定义的 XML 节点类型?

标签 python xml xsd xsd-validation

我正在用 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/

相关文章:

Python - 如何在没有selenium的情况下使用BeautifulSoup提取href(onclick)

python - 如何处理Libavg中的KeyEvents?

ios - 将一个非常简单的 XML 字符串解析为 NSDictionary

c# - 向元素添加 XML 属性

xml - xsd 模式是否有 xsd 模式?

javascript - (有限状态机)- 在 javascript 中实现 XML 模式验证器

xml - xjc 未按预期生成列表

使用动态 "is in"约束的 Python 字典架构验证

xml - 子节点中的命名空间为空

python - 强制 Django 测试将模型写入数据库