是否可以获得在XSD中定义的XML节点的类型?

2024-07-08 15:11:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python解析XML。我有一个XSD模式来验证XML。我能得到在XSD中定义的XML的特定节点的类型吗?在

例如,我的XML(小部分)是

<deviceDescription>
  <wakeupNote>
    <lang xml:lang="ru">Русский</lang>
    <lang xml:lang="en">English</lang>
  </wakeupNote> 
</deviceDescription>

我的XSD是(再一次是它的一小部分):

^{pr2}$

在解析过程中,我想知道我的标记wakeupNote在XSD中定义为complexTypezwv:说明。如何做到这一点(在python中)?在

我需要这个做什么?假设我有很多这样的xml,我想检查它们是否都有用英语填充的字段。检查<lang xml:lang="en"></lang>是否为空是很容易的,但是允许根本不指定这个标记。在

因此,我们的想法是获取所有可能具有语言描述的标记,并检查<lang>标记是否存在,并且是否有非空内容供en使用。在

UPD公司

因为在验证期间,我的XML是根据XSD检查的,所以验证引擎知道所有节点的类型。我7个月前也有过类似的问题,至今没有答案。他们是有血缘关系的。Validating and filling default values in XML based on XSD in Python


Tags: in标记类型lang节点定义englishru
2条回答

如果问题是:如何找到给定XML节点的类型名称? 答案是使用xpath in python来查找它。在xsd上运行的xpath将是

//element[@name='wakeupNote']/@type

这个应该会回来zwv:描述。如果它返回两个类型,则必须从根开始

^{pr2}$

从根上往下走会很乏味。你必须同时寻找命名类型和命名类型。在

如果问题是:如何找到给定类型的所有XML节点? 如果模式经常更改,可以在使用上述方法解析每个节点时测试其类型。在

如果模式是已知的、固定的,并且您要查找的节点可以用XPATH找到,那么可以测试每个节点。在

//@xml:lang='en'

然后使用python检查每一个的长度。在

在稳定模式的情况下,您可以编写第二个XSD来强制执行您正在寻找的条件。在

您是对的,验证器必须知道它验证的所有元素和属性的类型关联,并且验证器因此能够提供对这些信息的访问。在

然而,不管是好是坏,调用方和验证器之间的API以及调用方可用的验证相关信息的选择都是完全由实现定义的。一些验证器(xercesj是一个值得注意的例子)提供了非常全面的验证信息,而其他的则没有

如果不知道您使用的验证器是什么,没有人可以确定地告诉您您要查找的类型信息是否可用。由于您正在调用验证器,因此必须有一个API;如果类型关联通过API可用,那么文档可能会这样说。如果API没有提供对它的访问,可能是因为基础架构验证器没有提供对信息的访问,或者可能是因为API的创建者没有看到这一点;你的工作(如果你想更进一步的话)就是找出其中的一个,然后试图说服相关方,让他们知道提供这些信息是有用的。在

如果您无法通过API访问信息,您可以使用David W的另一个答案中提到的方法的更复杂版本来帮助自己。XSD架构的一个特性是,任何元素的控制类型严格来说都是从验证根到该元素的路径的函数,所以它就是原则上很简单(如果在实践中有点乏味的话),对于文档实例中的任何元素,如果文档实例根据特定的模式进行验证,那么它的管理类型是什么。例如,对于您所提到的情况,可以很容易地判断给定的wakeupNote是否有deviceDescription或{}作为祖先,或者如果{}同时具有这两个祖先,那么哪个是更近的祖先,并根据该知识推断适当的控制类型定义。在

以这种方式帮助自己可能需要大量的工作。如果有通用工具来计算这些信息并使其以各种形式被访问,这会有帮助,但如果有这样的工具,我就不知道这些工具了。(我知道有人可以免费构建这样一个工具。)所以如果我是你,我会先通过API获取信息。在

相关问题 更多 >

    热门问题