Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java xerces认为具有命名空间前缀的子元素无效_Java_Xml_Xsd - Fatal编程技术网

Java xerces认为具有命名空间前缀的子元素无效

Java xerces认为具有命名空间前缀的子元素无效,java,xml,xsd,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(

我使用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”:


.......
这给了我一个错误: cvc复杂类型.2.4.a:以元素“eml:dataset”开头的内容无效。内容必须匹配“((“”:访问){0-1},(((“”:数据集)|(“”:引用))|(“”:软件))|(“”:协议)),(“”:附加元数据){0-UNBOUNDED})”

我无法理解这一点。在模式定义期间,“dataset”具有默认名称空间。“数据集”只是“eml:dataset”的一个简略版本。为什么xerces不喜欢

你能给我一些线索吗


谢谢

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

要允许(甚至可能要求)在本地声明的元素前面加前缀,必须修改模式,方法是将elementFormDefault=“qualified”属性值对添加到基础全局元素的声明中,或者将form=“qualified”属性添加到模式的各个本地声明元素中(例如,数据集)


所有这些,还有一些!都在第3.1节和第3.2节中进行了解释。

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

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

然后,我能够在XML文档中的这个元素上添加名称空间前缀

                <sch:Grades>
                    <sch:GradeHigh/>


现在有效。之前没有“form=”限定"我会在上面的xml上得到一个验证错误

谢谢mjv。我尝试了你建议的方法。但仍然得到了错误:cvc复杂类型。2.4.a:以元素“emlds:dataset”开头的无效内容@Jing我完全不同意我的评估,数据集应该形成另一个名称空间。我读XSD太快了…目标是NSXSD是有效的”eml://ecoinformatics.org/eml-2.1.0,ecoinformatics.org中的其他名称空间用于类型,但元素本身有“eml”NS。现在,我想我知道了为什么我们不能将eml前缀添加到像dataset这样的元素,这是因为“本地声明的元素”的方式都是在XSD中配置的。请参阅我编辑的响应。dataset元素位于空命名空间中。您为什么不这么认为?
                <sch:Grades>
                    <sch:GradeHigh/>