2009-10-14 2 views
-1

Я пытаюсь использовать интерфейс IXMLDOMDocument2 (C++) для проверки документа Xml против какой-то схемы, и я получаю следующее сообщение об ошибке:Схема ошибки проверки «Дубликат имя <element>: имя =„X“»

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

Я пытаюсь понять, что это значит - есть ли проблема с моей схемой, или это проблема с Xml? Я проверил как схему, так и Xml, и оба они даже вряд ли содержат слово «конверт» дважды!

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> 
+0

какой об этом одинокий бирка? Это не принадлежит MySchhema? –

+0

Я предположил, что это произошло в силу тега targetNamespace. Не так ли? Я опустил большое количество элементов, которые называются аналогично (например, «отправитель», а не «id: отправитель»), поэтому я предположил, что это не проблема (но я не знаю: -S) – Justin

ответ

1

Я понял это благодаря комментарий, оставленный в конце this page на MSDN:

In MSXML4, schemaLocation and noNamespaceSchemaLocation were never used during validation: you should use a SchemaCache containing the schemas against which the document was validated. This was fine, because it allowed me to use 'local' versions of the schemas that were referenced in the XML document.

In MSXML6, this was changed: "Inline schemas and schemas referenced from an instance using xsi:SchemaLocation are now added to an XML instance-specific cache which wraps the user-supplied SchemaCache." Now, when i use the SchemaCache and add the 'local' version of the schemas that were referenced in the XML document, i get this error message: "Duplicate named : name = 'ROOT'".

It seems both xsi:schemaLocation and the SchemaCache are used during validation resulting in a conflict. Ik know i can use ResolveExternal=False so xsi:schemaLocation won't be used, but in that case xsd:import/xsd:include are not resolved either, so that's not an option.

я нашел Я могу либо удалить атрибут schemaLocation из входного xml, либо явно не добавить файл MySchema.xsd ument к кешу схемы и валидация будут успешными.

В конце концов я решил удалить атрибут schemaLocation, поскольку он сохраняет существующее поведение - Xml используется только внутри, и поэтому нет риска нарушения существующих клиентов.