Я использую документ схемы XML для проверки входящих документов с данными, однако схема во время выполнения выглядит сбойной, поскольку она относится к сложному типу, являющемуся частью внешней схемы. Внешняя схема указывается в элементе <xs:import>
в верхней части документа. Я подумал, что это может быть проблема с доступом, поэтому я переместил копию внешнего документа в папку localhost. Я получаю ту же ошибку, поэтому теперь мне интересно, может ли быть какая-то проблема с использованием элемента <xs:import>
.
Фрагмент документа схемы выглядит следующим образом:
<xs:schema targetNamespace="http://www.smpte-ra.org/schemas/429-7/2006/CPL" xmlns:cpl="http://www.smpte-ra.org/schemas/429-7/2006/CPL" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
...
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="http://localhost/TMSWebServices/XMLSchema/xmldsig-core-schema.xsd"/>
...
<xs:element name="Signer" type="ds:KeyInfoType" minOccurs="0"/>
...
</xs:schema>
Код, с которым я пытаюсь это выполнить, очень прост (получил от http://dotnetslackers.com/Community/blogs/haissam/archive/2008/11/06/validate-xml-against-xsd-xml-schema-using-c.aspx)
string XSDFILEPATH = @"http://localhost/TMSWebServices/XMLSchema/CPL.xsd";
string XMLFILEPATH = @"C:\foo\bar\files\TestCPLs\CPL_930f5e92-be03-440c-a2ff-a13f3f16e1d6.xml";
System.Xml.XmlReaderSettings settings = new System.Xml.XmlReaderSettings();
settings.Schemas.Add(null, XSDFILEPATH);
settings.ValidationType = System.Xml.ValidationType.Schema;
System.Xml.XmlDocument document = new System.Xml.XmlDocument();
document.Load(XMLFILEPATH);
System.Xml.XmlReader rdr = System.Xml.XmlReader.Create(new StringReader(document.InnerXml), settings);
while (rdr.Read())
{
}
Все идет хорошо, пока строка, которая создает экземпляр объекта XMLReader непосредственно перед циклом while. Тогда это терпит неудачу с ошибкой типа не объявленной. Тип, который он пытается найти, KeyInfoType, определен в одном из документов в элементе импорта. Я убедился, что пространства имен совпадают. Я задавался вопросом, вызывали ли проблемы знаки # в определениях пространства имен, но удаление их не имело никакого эффекта, это просто изменило то, на что была похожа ошибка (то есть "Тип" http://www.w3.org/2000/09/xmldsig:KeyInfoType' не объявлен. "Против" Типа " http://www.w3.org/2000/09/xmldsig#:KeyInfoType' не объявлено. ")
Я подозреваю, что в обработке элемента <xs:import>
есть что-то, что я пропускаю. Любые предложения очень приветствуются. Спасибо!