-1

IXMLDOMDocument2 インターフェイス (C++) を使用して、スキーマに対して Xml ドキュメントを検証しようとしていますが、次のエラーが発生します。

Duplicate named <element> : name = '{http://www.site.com/MySchema}envelope'.

これが何を意味するのか理解するのに苦労しています - 私のスキーマに問題がありますか、それとも Xml に問題がありますか? スキーマと Xml の両方を確認しましたが、「封筒」という単語が 2 回も含まれていることはほとんどありません。

XML:

<id:envelope xmlns:id="http://www.site.com/MySchema" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://www.site.com/MySchema MySchema.xsd">
  <id/>
  <!-- Load of unimportant elements -->
</id:envelope>

XSD:

<xsd:schema targetNamespace="http://www.site.com/MySchema" 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns="http://www.site.com/MySchema" elementFormDefault="unqualified">
    <xsd:element name="envelope" type="envelopeType">
        <!-- etc... -->
    </xsd:element>
    <xsd:complexType name="envelopeType">
        <!-- etc... -->
    </xsd:complexType>
    <!-- load of other types... -->
</xsd:schema>
4

1 に答える 1

1

MSDNのこのページの最後に残されたコメントのおかげで、私はこれを理解しました。

MSXML4 では、検証中に schemaLocation と noNamespaceSchemaLocation が使用されることはありませんでした。ドキュメントが検証されたスキーマを含む SchemaCache を使用する必要があります。XML ドキュメントで参照されているスキーマの「ローカル」バージョンを使用できるため、これで問題ありませんでした。

MSXML6 では、これが変更されました。ここで、SchemaCache を使用して、XML ドキュメントで参照されたスキーマの「ローカル」バージョンを追加すると、次のエラー メッセージが表示されます。

検証中に xsi:schemaLocation と SchemaCache の両方が使用され、競合が発生しているようです。私は ResolveExternal=False を使用できることを知っているので、 xsi:schemaLocation は使用されませんが、その場合、 xsd:import/xsd:include も解決されないため、オプションではありません。

入力 xml から schemaLocation 属性を削除するか、スキーマ キャッシュに MySchema.xsd ドキュメントを明示的に追加しないと、検証が成功することがわかりました。

最後に、既存の動作を保持するため、schemaLocation 属性を削除することにしました。Xml は内部でのみ使用されるため、既存のクライアントを壊すリスクはありません。

于 2009-10-14T13:35:23.860 に答える