2013-04-01 6 views
5

У меня есть хороший XML-файл, как это:C# XML-схемы проверки

<?xml version="1.0" encoding="utf-8" ?> 
    <Assets Path="C:\Users\r3plica\Google Drive"> 
     <Assetd> 
      <FileName>Boomerang - Error codes.xlsx</FileName> 
      <DisplayName>Boomerang - Error codes</DisplayName> 
      <Description>This is the Boomerang error codes file</Description> 
      <Tags> 
       <Tag>Excel</Tag> 
       <Tag>Boomerang</Tag> 
      </Tags> 
      <Categories> 
       <Category>1</Category> 
       <Category>4</Category> 
      </Categories> 
     </Assetd> 
     <Asset> 
      <FileName>Issue Tracker v5.xlsx</FileName> 
      <Description>This is the issue tracker for Skipstone</Description> 
      <Tags> 
       <Tag>Excel</Tag> 
       <Tag>Skipstone</Tag> 
      </Tags> 
      <Categories> 
       <Category>1</Category> 
       <Category>4</Category> 
      </Categories> 
     </Asset> 
    </Assets> 

, а затем у меня есть схемы, которые я создал так:

<?xml version="1.0" encoding="utf-8"?> 
    <xs:schema id="data" 
     targetNamespace="http://tempuri.org/data.xsd" 
     elementFormDefault="qualified" 
     xmlns="http://tempuri.org/data.xsd" 
     xmlns:mstns="http://tempuri.org/data.xsd" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    > 
     <xs:element name="Assets"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element name="Asset" type="Asset" minOccurs="1" /> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 

     <xs:complexType name="Asset"> 
     <xs:sequence> 
      <xs:element name="FileName" type="xs:string" minOccurs="1" maxOccurs="1" /> 
      <xs:element name="DisplayName" type="xs:string" minOccurs="0" maxOccurs="1" /> 
      <xs:element name="Description" type="xs:string" minOccurs="0" maxOccurs="1" /> 
      <xs:element name="Tags" type="Tags" minOccurs="0" maxOccurs="1" /> 
      <xs:element name="Categories" type="Categories" minOccurs="1" maxOccurs="1" /> 
     </xs:sequence> 
     </xs:complexType> 

     <xs:complexType name="Tags"> 
     <xs:sequence> 
      <xs:element name="Tag" type="xs:string" minOccurs="1" maxOccurs="unbounded" /> 
     </xs:sequence> 
     </xs:complexType> 

     <xs:complexType name="Categories"> 
     <xs:sequence> 
      <xs:element name="Category" type="xs:int" minOccurs="1" maxOccurs="unbounded" /> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:schema> 

Насколько я могу видеть, глядя на что файл XML является недействительным, поскольку первым элемент Assetd и не активы, но если я запускаю мои C# код:

XmlSchemaSet schemas = new XmlSchemaSet(); 
schemas.Add("http://tempuri.org/data.xsd", "data.xsd"); 

XDocument doc = XDocument.Load(openFileDialog1.FileName); 
string msg = ""; 
doc.Validate(schemas, (o, err) => 
{ 
    msg = err.Message; 
}); 
Console.WriteLine(msg == "" ? "Document is valid" : "Document invalid: " + msg); 

он говорит мне XML-действительна ... Если я использую этот код:

// Set the validation settings. 
XmlReaderSettings settings = new XmlReaderSettings(); 
settings.ValidationType = ValidationType.Schema; 
settings.Schemas.Add("http://tempuri.org/data.xsd", "data.xsd"); 
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema; 
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation; 
settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings; 
settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack); 

// Create the XmlReader object. 
XmlReader reader = XmlReader.Create(openFileDialog1.FileName, settings); 

// Parse the file. 
while (reader.Read()) ; 

Я получаю этот вывод в консоли:

Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Assets'. 
Warning: Matching schema not found. No validation occurred. Could not find schema information for the attribute 'Path'. 
Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Assetd'. 
Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'FileName'. 
Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'DisplayName'. 
Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Description'. 
Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Tags'. 
Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Tag'. 
Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Tag'. 
Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Categories'. 
Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Category'. 
Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Category'. 
Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Asset'. 
Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'FileName'. 
Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Description'. 
Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Tags'. 
Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Tag'. 
Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Tag'. 
Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Categories'. 
Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Category'. 
Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Category'. 

Может кто-нибудь сказать мне, что я делаю неправильно, пожалуйста? Это меня убивает :(

приветствий, /r3plica

+0

«Насколько я могу видеть, глядя на это, xml-файл недействителен, потому что первым элементом является Assetd, а не Asset, но если я запустил свой код C#: «Я думаю, вы уже знаете, что не так. – Bit

+0

Я не думаю, что вы понимаете. Я пытаюсь сделать его неудачным, но он утверждает, что он действителен. – r3plica

+0

Вторая часть или узел действительны. Думаю об этом. – Bit

ответ

8

Вам необходимо установить пространство имен по умолчанию в вашем XML, например:

<?xml version="1.0" encoding="utf-8" ?> 
    <Assets xmlns="http://tempuri.org/data.xsd"> 
     <Asset> 
      <FileName>Boomerang - Error codes.xlsx</FileName> 
      <DisplayName>Boomerang - Error codes</DisplayName> 
      <Description>This is the Boomerang error codes file</Description> 
      <Tags> 
       <Tag>Excel</Tag> 
       <Tag>Boomerang</Tag> 
      </Tags> 
      <Categories> 
       <Category>1</Category> 
       <Category>4</Category> 
      </Categories> 
     </Asset> 
     <Asset> 
      <FileName>Issue Tracker v5.xlsx</FileName> 
      <Description>This is the issue tracker for Skipstone</Description> 
      <Tags> 
       <Tag>Excel</Tag> 
       <Tag>Skipstone</Tag> 
      </Tags> 
      <Categories> 
       <Category>1</Category> 
       <Category>4</Category> 
      </Categories> 
     </Asset> 
    </Assets> 

Кроме того, существует целый ряд других проблем:

атрибут Path не определен в схеме, элемент «Assetd» не определен MaxOccurs = «неограниченный» должен быть установлен в схеме для хза:. имя элемента = «актива»

В случае, если вы не можете изменить XML, вам необходимо удалить целевую схему из XSD:

<xs:schema id="data" 
    xmlns:mstns="http://tempuri.org/data.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
> 

И зарегистрировать схему так:

settings.Schemas.Add(null, "data.xsd"); 
+0

спасибо, я не мог изменить XML, но делал вторую часть того, что вы предложили, работало отлично :) – r3plica

Смежные вопросы