带有名称空间前缀的children元素被xerces视为无效

时间:2009-10-01 20:07:08

标签: 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被视为有效。

但是,如果我将“eml”前缀添加到元素“dataset”:

<?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)|(”“:citation))|(”“:software))|(”“:protocol ))),( “”:additionalMetadata){0-UNBOUNDED})”

我无法理解这一点。 “dataset”在模式定义期间具有默认的命名空间。 “dataset”只是“eml:dataset”的删节版本。为什么xerces不喜欢?

你能告诉我一些线索吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

我认为任何解析器,不仅是xerces,都会报告有关 eml:dataset 的错误。
原因是eml:eml的模式不使用属性 elementFormDefault ,然后默认为“不合格”,因此要求“本地声明的元素”名称(例如数据集)不接收前缀(或默认命名空间的隐含命名空间)。只有全局元素(例如eml,here)可以(实际上需要)显式名称空间前缀。

要允许(或者甚至要求)本地声明的元素作为前缀,必须通过将elementFormDefault =“qualified”属性 - 值对添加到基础全局元素的声明来改变模式,或者通过将form =“qualified”属性添加到模式的各个本地声明的元素(例如,数据集)。

所有这些,然后是一些!,在W3C Schema Primer document的第3.1节,第3.2节中进行了解释。

答案 1 :(得分:1)

我能够使用您的建议解决我的问题。我声明我的元素如下:

<xs:element name="GradeHigh" type="xs:string" form="qualified" />

然后,我可以在XML文档中的此元素上添加名称空间前缀。

                <sch:Grades>
                    <sch:GradeHigh/>

现在有效。早期没有“form =”限定“我会在上面的xml上得到验证错误