Как обойти ошибку XSD «подстановочный элемент вызывает неоднозначность модели содержимого» - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть файл схемы XSD, который выдает следующую ошибку компиляции:

System.Xml.Schema.XmlSchemaException: 'Wildcard '##targetNamespace' allows
element 'http://mycompany.com/datamodel/tasks:OwnerID', and causes the 
content model to become ambiguous. A content model must be formed such that 
during validation of an element information item sequence, the particle 
contained directly, indirectly or implicitly therein with which to attempt 
to validate each item in the sequence in turn can be uniquely determined 
without examining the content or attributes of that item, and without any 
information about the items in the remainder of the sequence.'

Вот XSD и код для его компиляции:

using System.IO;
using System.Xml;
using System.Xml.Schema;

namespace TestXmlSchemaCompilation
{
    class Program
    {
        static void Main(string[] args)
        {
            var schemaText = @"<?xml version=""1.0"" encoding=""UTF-8""?>
            <schema xmlns=""http://www.w3.org/2001/XMLSchema"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:tasks=""http://mycompany.com/datamodel/tasks"" targetNamespace=""http://mycompany.com/datamodel/tasks"" elementFormDefault=""qualified"">
               <element name=""TaskInformation"" type=""tasks:TaskInformation"" />
               <complexType name=""TaskInformation"" >
                  <sequence >
                     <element name=""OwnerID"" type=""xsd:string"" minOccurs=""0"" maxOccurs=""unbounded"" />
                     <element name=""TaskID"" type=""xsd:string"" minOccurs=""0"" />
                     <element name=""ContentType"" type=""xsd:string"" minOccurs=""0"" maxOccurs=""unbounded"" />
                     <any namespace=""##targetNamespace"" minOccurs=""0"" maxOccurs=""unbounded"" />
                  </sequence>
               </complexType>
               <element name=""TaskData"" type=""tasks:TaskData"" />
               <complexType name=""TaskData"" >
                  <sequence >
                     <element name=""Id"" type=""xsd:string"" minOccurs=""0"" />
                     <element name=""Name"" type=""xsd:string"" minOccurs=""0"" />
                     <element name=""Type"" type=""xsd:string"" minOccurs=""0"" />
                     <element name=""Value"" type=""xsd:string"" minOccurs=""0"" />
                     <any namespace=""##targetNamespace"" minOccurs=""0"" maxOccurs=""unbounded"" />
                   </sequence>
                </complexType>
            </schema>";

            using (var stringReader = new StringReader(schemaText))
            using (var xmlReader = XmlReader.Create(stringReader))
            {
                var xmlSchemaSet = new XmlSchemaSet();
                xmlSchemaSet.Add(XmlSchema.Read(xmlReader, null));
                xmlSchemaSet.Compile();
            }
        }
    }
}

Есть ли способ изменить документ XSD, чтобы избежать этой ошибки, но сохранить первоначальное значение схемы? Я видел подобные вопросы, и если я правильно понимаю, парсер не знает, должен ли обнаруженный элемент проверяться на соответствие «любому» правилу или элементу, указанному явно. Я думаю, что такая ошибка не возникает для XSD 1.1, но более новая версия не поддерживается .NET. Есть ли какие-нибудь инструкции, которые я мог бы использовать, чтобы обойти это?

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