使用导入的命名空间解析 XML 模式
Posted
技术标签:
【中文标题】使用导入的命名空间解析 XML 模式【英文标题】:Parse XML schema with imported namespaces 【发布时间】:2022-01-12 12:01:38 【问题描述】:我有一个复杂的XML schema,由不同文件中定义的多个命名空间组成。下面是在 XSD Diagram 中创建的图,显示了架构的一小部分。
请注意,party
的类型为 partyType
,它在与 parties
不同的命名空间中定义。主文件 (veg.xsd
) 中 parties
的(简化)XML 如下所示:
...
<xsd:element name="parties" minOccurs="0">
<xsd:annotation>
<xsd:documentation>...</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="party" type="misc:partyType" maxOccurs="unbounded">
<xsd:annotation>
<xsd:documentation source="EML" xml:lang="en">...</xsd:documentation>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
...
现在,我的目标是为整个架构(跨命名空间)导出元素的层次结构,就像上图一样。但是,当我在 R 中解析 veg.xsd
时,我无法访问导入的命名空间。例如,当列出所有具有 name 属性的元素时,我只会得到 veg.xsd
中定义的元素的名称。
library(xml2)
def_xsd = read_xml("vegx_schema/veg.xsd")
xml_find_all(def_xsd, "//xsd:element") %>%
xml_attr("name") %>%
length()
[1] 52 # Should be much larger
任何帮助表示赞赏!
【问题讨论】:
【参考方案1】:正如您所发现的,处理源架构文档并不容易。
最好通过 API 处理已编译的架构。
我不知道 libxml2 以这种方式提供什么。如果您可以使用 Java,那么 Xerces 为编译后的模式提供 Java API,Saxon 允许您将编译后的模式导出为 SCM 文件(这是 XML,但与源模式不同,它全部组装成单个文档,更容易过程)。
【讨论】:
哦,那是个坏消息。然而,libxml2 可以根据模式验证 xml 文件的事实让我认为它确实知道如何将这些部分放在一起。我将问题留待一会儿,也许有人有其他解决方案。 当然,libxml2 知道如何将模式编译为某种内部结构化表示。我不知道它是否为用户/应用程序提供了通过 API 访问该表示的任何权限。看http://xmlsoft.org/html/libxml-xmlschemas.html
似乎可能,但这看起来非常低级。以上是关于使用导入的命名空间解析 XML 模式的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# 中使用事件驱动的 SAX(Simple API FOR XML) 解析器,还是使用 System.XML 命名空间更好?