使用导入的命名空间解析 XML 模式

Parse XML schema with imported namespaces

我有一个复杂的 XML schema,由在不同文件中定义的多个命名空间组成。下面是在 XSD 图中创建的图,显示了架构的一小部分。

请注意,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

感谢任何帮助!

如您所见,处理源模式文档并不容易。

通过 API.

处理编译的模式要好得多

我不知道 libxml2 以这种方式提供了什么。如果您可以使用 Java,那么 Xerces 会为已编译的模式提供 Java API,而 Saxon 允许您将已编译的模式导出为 SCM 文件(即 XML,但与源模式不同的是,它全部组合到一个更容易处理的文档中。