2013-11-28 7 views
1

У меня есть 2 схемы XSD:C# Проверка XML

A.xsd

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="myns" xmlns:myns="myns"> 
    <xs:include schemaLocation="B.xsd"/> 
    <xs:element name="A"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="myns:B" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

и B.xsd

<?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:schema> 

И у меня есть 2 файла XML:

первый

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

второй

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

Я проверить XML с этим кодом

var schemas = new XmlSchemaSet(); 
schemas.Add("myns", "A.xsd"); 
xdoc.Validate(schemas, OnValidating); 

Оба этих XML является действительным, но мне нужно, что первый XML является действительным, и второй нет. Как я могу это сделать?

XSD-схемы, поставляемые третьи стороны и не могут быть изменены.

+0

Вы хотите недопустимый XML, который не проходит проверку? try sdf Это не удастся, так как для проверки требуется B, а не C. –

+0

Да, C будет недействительным :) –

+0

Мне нужна проверка отказов с элементом B во втором xml. 'XmlSchemaSet.Add()' загружает все схемы, соответствующие методам A.xsd и 'XDocument.Validate()', подтверждает, что xml соответствует одной из схем. Как я могу проверить только с помощью схемы A.xsd? –

ответ

0

Проблема, которую вы не можете решить, используя только ваш валидатор акций. Тот факт, что XSD-компоненты распространяются в разных файлах, ничего не значит для XSD-валидатора. Идея состоит в том, что «Ссылка на компоненты схемы из документа схемы управляется единообразным образом, соответствует ли компонент элементу информации элемента из того же документа схемы или импортируется».

Таким образом, без особых ограничений приложения документ с корневым элементом A и другим с корневым элементом B будет проверять то же самое, просто потому, что процессор может найти объявление глобального элемента для обоих.

Что вам нужно сделать, так это создать пользовательский шаг предварительной проверки на основе некоторой информации о конфигурации, определяющей список разрешенных корневых элементов. Если в списке найдено квалифицированное имя элемента документа, перейдите к обычной проверке; в противном случае, с самого начала не получится. Проверка имени элемента документа способом, который не добавляет накладные расходы времени выполнения для вашего приложения, зависит от того, как ваш XML будет получен, т. Е. Если DOM задействован или читатели и/или базовый поток могут искать и т. Д.

Что касается списка допустимых элементов ... если происходит то, что любые глобальных элементов, найденных в A.xsd, рассматривается вашим приложением как действительный элемент документа в документе экземпляра XML, тогда вы можете легко извлечь список разрешенных корневых элементов квалифицированных имен путем перемещения файла A.xsd с использованием .NET's SOM API; итерации через XmlSchema.Items, ищите XmlSchemaElement типы и его QualifiedName.

Вы можете использовать словарь для кэширования списка разрешенных уточненных имен, или LINQ путем сбора и т.д.

Смежные вопросы