『XML』XML/XSD命名空间解析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了『XML』XML/XSD命名空间解析相关的知识,希望对你有一定的参考价值。

参考技术A 观察下面这个xml文件(spring框架文件头):

假设有如下情况:
有个 table.xml 文件,在表格中记载着歌词:

还有另外一个 table.xml 文件,记录着一张桌子的信息:

如果我们工作需要同时使用这两个xml文件,这样就会出现2个 <table> 元素,必然会造成解析错误,无法正常处理。<br />

github 就是命名空间前缀,它主要是代指后面命名空间的,不用每次都写那么长,用前缀就可以了。

回到 table 的问题,在xml文件中声明了命名空间后,可以写成如下形式

以及:

这样就对 table 以及其子元素进行了区分,不会造成同名冲突问题。

xsd文件其实也是xml文件,它的作用是校验一个xml文件的格式,dtd文件也是同样作用,但是xsd功能更加强大,语法更加优雅。

这是一个<schema>标签,它是xsd的核心标签:

以上就是xml/xsd文件命名空间配置介绍。

参考资料:

<br /><br />

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

【中文标题】使用导入的命名空间解析 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』XML/XSD命名空间解析的主要内容,如果未能解决你的问题,请参考以下文章

xquery 转换在元素中创建空命名空间

php解析带有命名空间的xml

dom4j解析带命名空间的xml文件

在不修改 C# XSD 类的情况下向 XML 序列化添加前缀和命名空间

XML XSD 错误:org.xml.sax.SAXParseException:s4s-elt-schema-ns:元素“配置”的命名空间必须来自模式命名空间

JAXB:为啥在生成的 xml 文档中未使用定义的命名空间前缀?