2009-10-01 59 views
0

我需要使用Xerces到无效的XML实例对架构:孩子命名空间前缀元素被认为是无效的Xerces的

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”,以元素 “数据集”:

<?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-复杂type.2.4.a:无效的内容开始元素“EML :数据集”。内容必须匹配'(((“”:access:){0-1},((((“”:dataset)|(“”:citation))|(“”:software))|(“”:protocol ))),( “”:additionalMetadata){0-UNBOUNDED})”。

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

您能否给我一些线索?

谢谢!

+0

数据集元素位于空名称空间中,是什么让你以其他方式去思考? – Alohci 2009-10-01 21:37:34

回答

1

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

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

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

+0

谢谢mjv。 我尝试了你建议的方式。但仍然得到错误: cvc-complex-type.2.4.a:以元素'emlds:dataset'开头的无效内容 – Jing 2009-10-01 20:57:25

+0

@Jing我的评价是数据集本应该形成另一个命名空间。 XSD太快...... XSD中的目标NS实际上是“eml://ecoinformatics.org/eml-2.1.0”,ecoinformatics.org中的其他命名空间是针对类型的,但元素本身具有“ eml“NS。现在,我想我知道为什么我们不能将eml前缀添加到像数据集这样的元素,这是因为在XSD中配置了“本地声明元素”的方式。看到我编辑的回复。 – mjv 2009-10-02 08:02:48

1

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

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

然后,我能够在XML文档中的元素上放置命名空间前缀。

   <sch:Grades> 
        <sch:GradeHigh/> 

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

相关问题