XmlSchema.Read в .NET

freezer

Такая проблема:
Сначала качаю XSD-схему для XSLT, отсюда: http://www.w3.org/2007/schema-for-xslt20.xsd
Потом пытаюсь её загрузить таким кодом:
            XmlSchema schema;
using (FileStream fs = new FileStream(@"C:\Projects\Visual Studio 2005\Projects\WindowsApplication1\WindowsApplication1\schema-for-xslt20.xsd", FileMode.Open
schema = XmlSchema.Read(fs, null);
schema.Compile(null);

На Compile получаем исключение:
An unhandled exception of type 'System.Xml.Schema.XmlSchemaException' occurred in System.Xml.dll
Additional information: Символы шаблона '##other' и '##local' не имеют пустого пересечения и создают неоднозначность модели содержимого. Модель содержимого должна быть сформирована таким образом, чтобы в процессе проверки последовательности информационных единиц элемента часть, содержащаяся в ней прямо, опосредованно или неявно, с которой должна проверяться каждая единица последовательности, в свою очередь могла быть однозначно определена без изучения содержимого или атрибутов этой единицы и получения дополнительных данных об остальных единицах в последовательности.
Отсюда вопрос: у кого кривые руки, у MS, у W3C или у меня, и как исправить, чтоб работало?

freezer

всё заработало только после вырезания из XSD секции
<xs:element name="import-schema" substitutionGroup="xsl:declaration">
<xs:complexType>
<xs:complexContent>
<xs:extension base="xsl:element-only-versioned-element-type">
<xs:sequence>
<xs:element ref="xs:schema" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="namespace" type="xs:anyURI"/>
<xs:attribute name="schema-location" type="xs:anyURI"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
:confused:

njvfc1

1. Compile из xmlSchema лучше никогда не использовать, если конечно не .NET 1.1.
2. Правильный ответ такой (некоторое шаманство с prohibitDtd и явным добавлением XMlSchema.xsd нужно, т.к. автоматически по include/schemalocation Xmlschema.xsd не подхватывается — запрещена обработка этого самого dtd):


static void SomeMethod
{

XmlSchemaSet schemaSet = new XmlSchemaSet;
XmlTextReader reader = new XmlTextReader("http://www.w3.org/2001/XMLSchema.xsd");
reader.ProhibitDtd = false;
schemaSet.ValidationEventHandler +=new ValidationEventHandler(schemaSet_ValidationEventHandler);
schemaSet.Add(null, reader);
schemaSet.Add(null, "http://www.w3.org/2007/schema-for-xslt20.xsd");
schemaSet.Compile;
}

static void schemaSet_ValidationEventHandler(object sender, ValidationEventArgs e)
{
if (e.Severity == XmlSeverityType.Warning)
{
Console.Write("WARNING: ");
Console.WriteLine(e.Message);
}
else if (e.Severity == XmlSeverityType.Error)
{
Console.Write("ERROR: ");
Console.WriteLine(e.Message);
}
}

freezer

работает!
Огромное спасибо! :appl:
Оставить комментарий
Имя или ник:
Комментарий: