2009-10-01 68 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中得到一個驗證錯誤

相關問題