我使用 xerces 根据架构验证 xml 实例:
parser.setFeature("http://xml.org/sax/features/namespaces", true);
parser.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
parser.setFeature("http://xml.org/sax/features/validation", true);
parser.setProperty("http://apache.org/xml/properties/schema/external-schemaLocation",
schemaLocation);
parser.setFeature("http://apache.org/xml/features/validation/schema", true);
parser.parse(new InputSource(xml));
这是我的 xml 实例:
<?xml version="1.0"?>
<eml:eml packageId="tao.12926.1" system="knb" xmlns:eml="eml://ecoinformatics.org/eml-2.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="eml://ecoinformatics.org/eml-2.1.0 eml.xsd">
<dataset>
.......
</dataset>
</eml:eml>
此 xml 被视为有效。
但是,如果我向元素“dataset”添加前缀“eml”:
<?xml version="1.0"?>
<eml:eml packageId="tao.12926.1" system="knb" xmlns:eml="eml://ecoinformatics.org/eml-2.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="eml://ecoinformatics.org/eml-2.1.0 eml.xsd">
<eml:dataset>
.......
</eml:dataset>
</eml:eml>
它给了我一个错误: cvc-complex-type.2.4.a:以元素“eml:dataset”开头的无效内容。内容必须匹配 '((("":access){0-1},(((("":dataset)|("":引用))|("":software))|("":protocol ))),("":additionalMetadata){0-UNBOUNDED})'。
我无法理解这一点。在我们的模式定义期间,“数据集”具有默认的命名空间。 “dataset”只是“eml:dataset”的缩写版本。为什么 xerces 不喜欢?
能给我一些线索吗?
谢谢!
最佳答案
我认为任何解析器,不仅仅是 xerces,都会报告有关 eml:dataset 的错误。
原因是 eml:eml 的架构不使用属性 elementFormDefault,该属性默认为“不合格”,因此要求“本地声明的元素”名称(例如数据集)不接收前缀(或通过默认 namespace 隐含的 namespace )。只有全局元素(例如此处的 eml)可以具有(实际上,需要)显式 namespace 前缀。
为了允许(或者甚至可能要求)本地声明的元素带有前缀,必须更改架构,方法是将 elementFormDefault="qualified"属性值对添加到底层全局元素的声明中,或者通过向架构的各个本地声明元素(例如数据集)添加 form="qualified"属性。
所有这些,以及一些!,在 W3C Schema Primer document 的第 3.1、3.2 节中进行了解释。 .
关于java - xerces 认为具有 namespace 前缀的子元素无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1506158/