我使用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不喜欢?
你能告诉我一些线索吗?谢谢!
答案 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上得到验证错误