4

I have the XML:

<?xml version="1.0" encoding="utf-8"?>
<song id="id1" 
          xmlns="urn:Test:Song:1.0" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xsi:schemaLocation="urn:Test:Song:1.0 song.xsd">
  <name>name1</name>
</song>

It fails to validate against the XSD:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns="urn:Test:Song:1.0" 
               targetNamespace="urn:Test:Song:1.0" 
               xmlns:xs="http://www.w3.org/2001/XMLSchema" >

  <xs:element name="song">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0" />
    </xs:sequence>
    <xs:attribute name="id" type="xs:string" />
  </xs:complexType>
  </xs:element>
</xs:schema>

in Eclipse and Visual Studio. In Eclipse the error is: cvc-complex-type.2.4.a: Invalid content was found starting with element 'name'. One of '{name}' is expected.

Validation succeeds for the XML:

<?xml version="1.0" encoding="utf-8"?>
<song id="id1" 
          xmlns="urn:Test:Song:1.0" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xsi:schemaLocation="urn:Test:Song:1.0 song.xsd">
  <name xmlns="">name1</name>
</song>

The only difference is xmlns="" on the name element. Is there a way to make validation succeed on the first without the use of "no namespace"? What exactly is causing the first XML to fail?

4

1 に答える 1

4

elementFormDefault="qualified"schemas<xs:schema>要素に属性を追加する必要があります。

グローバルに定義された要素と属性のみが、スキーマのターゲット名前空間に自動的に含まれます。定義内で<complexType>定義される要素は、ローカルであると言われます。属性elementFormDefaultは、ローカル要素を修飾するかどうかを定義します。属性にはattributeFormDefault属性があります。

これらの属性のデフォルト値は ですunqualified。したがって、スキーマでは、要素<name>には名前空間 URI がないと見なされます。通常、すべての要素がターゲット名前空間にあることが望ましいため、elementFormDefault="qualified"属性を使用するのが一般的です。一方、属性は通常、名前空間を持つべきではないため、attributeFormDefault省略されることがよくあります。

W3C 勧告の詳細情報http://www.w3.org/TR/xmlschema-0/#re​​f50

于 2013-02-19T22:23:14.100 に答える