Настроить проверку xsd, чтобы частично игнорировать порядок - PullRequest
0 голосов
/ 29 января 2012

У меня есть XML-запрос, который должен быть проверен XSD ... (невозможно ??)

К сожалению, схема xsd для xml содержит xsd: выбор между двумя последовательностями.

но я указываю обе эти последовательности в моем XML-запросе.

это приводит к сбою xsd в xml, есть ли какое-либо указание о том, как переопределить эту проверку?

При условии:

1. Схема XSD стандартизирована и не может быть изменена.

2. Любое изменение должно быть сделано в коде C # позади того, где я применяю проверку.

то же самое спрашивали в:

Игнорировать порядок элементов при проверке XML по XSD

но ответ был на изменение схемы xsd, которая была принятым пользователем ответом.

update1

XML похож на это:

...
<elem>
    <subElemA>textValA</subElemA>
    <subElemB>textValA</subElemB>
<elem>
...

но XSD говорит:

...
<xsd:choice>
    <xsd:element name="subElemA" minOccurs="0" maxOccurs="1">
    </xsd:element>
    <xsd:element name="subElemB" minOccurs="0" maxOccurs="1">
    </xsd:element>
</xsd:choice>
...

& если бы я удалил subElemA ИЛИ subElemB из xml, тогда схема xml будет успешно проверена.

Update2

Я надеюсь найти решение, которое включает в себя настройку кода проверки схемы, чтобы средство проверки схемы могло обойти эту проверку; Код для проверки схемы:

   XmlReaderSettings setting = new XmlReaderSettings();
   setting.ConformanceLevel = ConformanceLevel.Document;
   setting.IgnoreComments = true;
   setting.IgnoreWhitespace = true;
   setting.IgnoreProcessingInstructions = true;
   setting.ValidationType = ValidationType.Schema;
   setting.Schemas.Add(defaultNameSpace, schemaLocation.AbsoluteUri);
   setting.ValidationEventHandler += new ValidationEventHandler(this.SchemaValidationCallBack);
   MemoryStream ms = new MemoryStream(System.Text.Encoding.ASCII.GetBytes(xmlToValidate));
   XmlReader reader = XmlReader.Create(ms, setting);
   while (reader.Read());

1 Ответ

2 голосов
/ 31 января 2012

Вероятно, то, что вы пытаетесь сделать, невозможно.С точки зрения валидатора, XML-схема - это контракт, который вы пытаетесь проверить.Если ваш документ не соответствует этому контракту, то валидатор не может его принять (иначе он будет противоречить тому, что вы просили его сделать).

Если вам действительно нужно принять этот документ XML,способ, которым вы дадите команду валидатору принять его, будет состоять в том, чтобы изменить контракт, который он пытается применить (схема).Лучший способ сделать это - работать с вашей третьей стороной, чтобы помочь им разрешить конфликты между их схемой и документами экземпляра, которые они предоставляют.Без этого любой, кто попытается выполнить контракт, столкнется с теми же проблемами, что и вы.

Если это невозможно, вы можете обойти систему, создав локальный файл схемы, который был изменен для разрешенияэкземпляр документа для проверки.Вместо загрузки схемы клиентов в ваш валидатор, вместо этого загрузите альтернативную реализацию.Это позволит вам проверить документ, не обновляя официальную схему третьей стороной.Это может легко превратиться в проблему обслуживания, поскольку ваша локальная копия может стать несинхронизированной с изменениями в исходной схеме, однако, если они не хотят менять схему для этого экземпляра документа, возможно, схема не меняетсячасто в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...