8

次のXSDを(Eclipseを使用して)作成しました。

  <?xml version="1.0" encoding="UTF-8"?>
  <schema targetNamespace="http://www.example.com" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.example.com">
    <element name="Make">
      <complexType>
        <sequence>
          <element name="Scope"></element>
        </sequence>
      </complexType>
    </element>
  </schema>

この単純なXMLで検証します

  <?xml version="1.0"?>
  <Make xmlns="http://www.example.com">
    <Scope>
    </Scope>
  </Make>

与える:

  xmllint.exe --noout --schema sources.xsd sources.xml
  sources.xml:3: element Scope: Schemas validity error : Element '{http://www.example.com}Scope': This element is not expected. Expected is ( Scope ).
  sources.xml fails to validate

私の意見では、これは正しくなければなりません。XMLファイルは名前空間http://www.example.comにあります(バリデーターも言っています)。

XSDの場合、デフォルトの名前空間をXSDスキーマに設定し(これはEclipseが行うことなので、正しいはずです!)、正しいtargetNamespaceを指定します。私も使ってみました

<element name="tnd:Scope" />

ただし、これも機能しません。

これはxmllintのバグですか、それともどこに問題がありますか?

よろしくdivB

4

3 に答える 3

4

@dbasemansの回答に代わる方法は、修飾elementFormDefaultされたものとして指定することです。

 <schema targetNamespace="http://www.example.com"
     xmlns="http://www.w3.org/2001/XMLSchema"
     xmlns:tns="http://www.example.com"
     elementFormDefault="qualified">

xsdスキーマ名前空間にorプレフィックスを使用するxsことは一般的と見なされる可能性があるため、dbasemanの提案に従ってスキーマを変更することを選択することをお勧めします。

于 2012-05-04T08:26:45.247 に答える
2

検証する XML ファイルに修飾子を指定しない場合は、 targetNamespaceとルート XSD 名前空間の両方を同じ値に設定する必要があります。したがって、次のようにする必要があります。

<schema targetNamespace="http://www.example.com" xmlns="http://www.example.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

しかしもちろん、XSD 要素を xsd: で修飾する必要があります。つまり、XML ファイルをそのまま検証するには、次のようにスキーマを記述する必要があります。

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://www.example.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.example.com">
    <xsd:element name="Make">
        <xsd:complexType>
            <xsd:sequence>
               <xsd:element name="Scope"></xsd:element>
            </xsd:sequence>
       </xsd:complexType>
    </xsd:element>
</xsd:schema>

詳細については、こちらをご覧ください: http://www.xfront.com/DefaultNamespace.pdf

編集エラーを指摘してくれた PetruGardea に感謝します。Filbert の回答が示すように、elementFormDefaultはデフォルトでは修飾されていません。つまり、インスタンス ドキュメントは対象の名前空間にあると見なされます。したがって、Filbert の答えは正しいです。唯一の代替手段は、targetNamespaceを省略し、 elementFormDefaultunqualifiedのままにして、インスタンス ドキュメントから名前空間の参照を完全に削除することにより、すべてを匿名にすることです。

elementFormDefault の機能の詳細は次のとおりです: http://www.xfront.com/HideVersusExpose.html

于 2012-05-04T08:21:15.543 に答える
1

XSDを変更できない、または変更したくない場合は、この問題の別の解決策を見つけました。次の XML は、XSD に準拠しています。

<?xml version="1.0"?>
<tns:Make xmlns:tns="http://www.example.com">
    <Scope>
    </Scope>
</tns:Make>

が非修飾に設定されている場合elementFormDefault、グローバル要素の名前空間を定義する必要があり、ローカル要素の名前空間を定義してはなりません。グローバル要素は XSD のスキーマ要素の直下にある要素であり、ローカル要素は他の要素にネストされた要素です。エラーは、デフォルトの名前空間を使用してローカル要素 Scope の名前空間を定義することによって発生します。

http://www.oracle.com/technetwork/articles/srivastava-namespaces-092580.htmlに詳しい説明があります。

于 2016-03-21T10:25:42.957 に答える