2013-04-01 12 views
5

Mam ładne plik XML tak:c walidacja # XML Schema

<?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> 

a następnie Mam schemat, który stworzyłem tak:

<?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> 

O ile widzę patrząc na że plik XML jest nieważne, ponieważ pierwszy element jest Assetd i nie aktywów, ale jeśli mogę uruchomić mojego kodu 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); 

mówi mi xml jest ważna ... Jeśli używam tego kodu:

// 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()) ; 

mogę tego wyjścia w konsoli:

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'. 

Czy ktoś może mi powiedzieć co robię źle proszę? To mnie zabija :(

okrzyki, /r3plica

+0

„O ile widzę patrząc na tym, plik xml jest nieprawidłowy, ponieważ pierwszym elementem jest Assetd, a nie Asset, ale jeśli uruchomię mój kod C#: "Myślę, że już wiesz, co jest nie tak. – Bit

+0

Nie sądzę, że rozumiesz. Próbuję sprawić, by to się nie udało, ale stwierdza, że ​​jest ono ważne. – r3plica

+0

Druga część lub węzeł jest poprawny. Pomyśl o tym. – Bit

Odpowiedz

8

Musisz ustawić domyślnej przestrzeni nazw w XML, takich jak to:

<?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> 

Ponadto, istnieje szereg innych problemów:

atrybut Ścieżka nie jest zdefiniowany w schemacie element „Assetd” nie jest zdefiniowane maxOccurs = „nieograniczona” należy ustawić w schemacie dla xs. element name = „aktywa”

W przypadku, gdy nie można modyfikować xml, trzeba usunąć schemat docelowy z xsd:

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

i zarejestrować schemat tak:

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

dziękuję, nie mogłem modyfikować XML, ale robiąc drugą część tego, co zasugerowałeś, zadziałało idealnie :) – r3plica

Powiązane problemy