устранение неполадок местоположения в элементе <xs: import> в C # - PullRequest
0 голосов
/ 02 мая 2009

Я использую документ схемы 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> есть что-то, что я пропускаю. Любые предложения очень приветствуются. Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 мая 2009

Хорошо, это немного сбивает с толку. Я попытался сделать это несколькими различными способами, включая добавление строки:

settings.ValidationFlags |= System.Xml.Schema.XmlSchemaValidationFlags.ProcessSchemaLocation;

и я продолжаю получать ту же ошибку:

Type 'http://www.w3.org/2000/09/xmldsig#:KeyInfoType' is not declared.

Документ, указанный этим пространством имен:

http://localhost/TMSWebServices/XMLSchema/xmldsig-core-schema.xsd

Документ доступен там, где я нахожусь, и я могу найти (кажущийся) нарушающий тип KeyInfoType в строке 152.

Ради интереса я проверил проверяемый документ и обнаружил, что элемент, определенный в схеме этого типа, не находится в документе. Схема определяет его как необязательный (minOccurs = "0"), поэтому проблема не в этом.

Кажется, что-то странное в способности платформы компилировать документ schmea, когда этот документ импортирует документы внешней схемы. Кто-нибудь видел такое поведение? Google не оказался плодотворным для этой проблемы, хотя он дал мне несколько предложений, чтобы попробовать. Спасибо!

0 голосов
/ 02 мая 2009

Я думаю, вам нужно добавить всего одну строку кода, чтобы она заработала:

settings.ValidationFlags =  
      System.Xml.Schema.XmlSchemaValidationFlags.ProcessSchemaLocation;

Марк

...