java - xerces 认为具有 namespace 前缀的子元素无效

标签 java xml xsd

我使用 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/

相关文章:

java - 有没有办法为同一个 ImageView 使用多个源?

wsdl - 如何从 wsdl 生成 xsd

regex - 不允许空字符串的 XML 模式限制模式

java - 当前光标位置的操作无效 (Java DB)

Java For循环计数器在调用递归方法时不工作

java - Oracle JPA GenerationType.AUTO 与生成器要求 "hibernate_sequence"

java - jackson fasterxml 多个同名元素

Java ME记录存储问题

java - 带 vector 绘图的 RadioButton

xml转换