2012-01-06 17 views
4

私はXmlDに対してXmlを検証するためにXmlReaderを使用しています。XmlSchemaValidationException: 'B'要素が宣言されていません

私は、このXMLにこのスキーマに対して

<?xml version="1.0" encoding="utf-8" ?> 
<A><B>sdf</B></A> 

を検証:

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

<xs:element name="B" type="xs:string" /> 

<xs:element name="A"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="B"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

</xs:schema> 

検証はOKです。

しかし、私は、名前空間追加した場合:

<?xml version="1.0" encoding="utf-8" ?> 
<A xmlns="myns"><B>sdf</B></A> 

と対応するスキーマ:

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

<xs:element name="B" type="xs:string" /> 

<xs:element name="A"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="B"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

</xs:schema> 

を私はSystem.Xml.Schema.XmlSchemaValidationExceptionを受け入れる 'B' 要素が宣言されていません。 これはなぜ発生するのですか?名前空間を追加するにはどうしたらいいですか?

答えて

5

検証エラーが発生する理由は、スキーマが実際には2つのスキーマであるためです。 2つのルート要素AとBがあります。ルート要素は、暗黙的に型として使用することはできません。 XSDに、インポートを使用して別のスキーマのタイプを使用するか、またはそのタイプを(complexType定義を使用して)スキーマに対してローカルにするかを指示する必要があります。

:Bをそれ自身のスキーマに抽出します。これは、同じ名前空間を共有することはできません。

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="myns2"> 
    <xs:element name="B" type="xs:string" /> 
</xs:schema> 

その後、インポートを使用することによってあなたのタイプからBを参照することができます。

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="myns" xmlns:myns2="myns2"> 

    <xs:import namespace="myns2" /> 

    <xs:element name="A"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="myns2:B" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

はこれを使用すると、以下の有効なXMLインスタンスを持つことができます:

<?xml version="1.0" encoding="utf-8" ?> 
<A xmlns="myns"> 
    <B xmlns="myns2">sdf</B> 
</A> 

タイプの非namespaceバージョンを検証できた理由は、有効なXMLになるためには、2つの条件が真でなければならないからです。

まあXML
  • 非namespace'd XMLファイルでに任意参照スキーマタイプ
  • に適合しなければならない形成

    • 、任意のスキーマ・タイプへの参照は、したがって、定義によって存在しませんdocumentは有効なXMLです。

    +0

    +1は、スキーマBからスキーマAを抽出することを示唆しています。それは私を助けました! :) – Learner

    関連する問題