『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命名空间解析的主要内容,如果未能解决你的问题,请参考以下文章
在不修改 C# XSD 类的情况下向 XML 序列化添加前缀和命名空间
XML XSD 错误:org.xml.sax.SAXParseException:s4s-elt-schema-ns:元素“配置”的命名空间必须来自模式命名空间