XML проверки схемы - PullRequest
       19

XML проверки схемы

9 голосов
/ 03 января 2011

У меня есть файл XSD и файл XML, как я могу проверить, находится ли XML в правильной схеме, такой как файл XSD?

я знаю, что в классе XmlDocument есть функция проверки,но для этого нужен обработчик событий, и все, что мне нужно, это true или false.

PS Я работаю в Visual Studio 2010.

Ответы [ 3 ]

23 голосов
/ 09 января 2011

есть гораздо более простой способ сделать это:

private void ValidationCallBack(object sender, ValidationEventArgs e)
{  
    throw new Exception();
}

public bool validate(string sxml)
{
    try
    {
        XmlDocument xmld=new XmlDocument ();
        xmld.LoadXml(sxml);
        xmld.Schemas.Add(null,@"c:\the file location");
        xmld.validate(ValidationCallBack);
        return true;
    }
    catch
    {
        return false;
    }
}

П.С .: Я не писал этого в VS, так что может быть слово, которое не чувствительно к регистру, но этот код работает!

3 голосов
/ 03 января 2011

Вы можете создать проверяющий экземпляр XmlReader, используя класс XmlReaderSettings и метод Create.


private bool ValidateXml(string xmlFilePath, string schemaFilePath, string schemaNamespace, Type rootType)
{
    XmlSerializer serializer = new XmlSerializer(rootType);

    using (var fs = new StreamReader(xmlFilePath, Encoding.GetEncoding("iso-8859-1")))
    {
        object deserializedObject;
        var xmlReaderSettings = new XmlReaderSettings();
        if (File.Exists(schemaFilePath))
        {
            //select schema for validation  
            xmlReaderSettings.Schemas.Add(schemaNamespace, schemaPath); 
            xmlReaderSettings.ValidationType = ValidationType.Schema;
            try
            {
            using (var xmlReader = XmlReader.Create(fs, xmlReaderSettings))
            {                
                if (serializer.CanDeserialize(xmlReader))
                {
                    return true;
                    //deserializedObject = serializer.Deserialize(xmlReader);
                }
                else
                {
                    return false;
                }
            }
            }
            catch(Exception ex)
            { return false; }
        }
    }
}

Приведенный выше код вызовет исключение, если схема недопустима или не может десериализовать xml.rootType - это тип корневого элемента в эквивалентной иерархии классов.


Пример: Схема в: Учебник по схеме XML .Сохраните файл как D:\SampleSchema.xsd.

Выполнить xsd.exe:

  1. Открыть меню «Пуск»> Все программы> Microsoft Visual Studio 2010> Инструменты Visual Studio> Командная строка Visual Studio 2010 '
  2. Inвведите в командной строке: xsd.exe /c /out:D:\ "D:\SampleSchema.xsd"
  3. Параметры xsd: /out опция для указания выходного каталога, /c для указания инструмента для генерации классов
  4. Иерархия выходных классовприсутствует в D:\SampleSchema.cs
  5. Сгенерированная иерархия классов выглядит примерно так:

//------------------------------------------------------------------------------
// 
//     This code was generated by a tool.
//     Runtime Version:2.0.50727.4952
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// 
//------------------------------------------------------------------------------

using System.Xml.Serialization;

// 
// This source code was auto-generated by xsd, Version=2.0.50727.3038.
// 


/// 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class note {

    private string toField;

    private string fromField;

    private string headingField;

    private string bodyField;

    /// 
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string to {
        get {
            return this.toField;
        }
        set {
            this.toField = value;
        }
    }

    /// 
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string from {
        get {
            return this.fromField;
        }
        set {
            this.fromField = value;
        }
    }

    /// 
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string heading {
        get {
            return this.headingField;
        }
        set {
            this.headingField = value;
        }
    }

    /// 
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string body {
        get {
            return this.bodyField;
        }
        set {
            this.bodyField = value;
        }
    }
}

Добавьте класс в проект Visual Studio.
Для приведенного выше примера xsd корневым классом является note.
Вызовите метод,


bool isXmlValid = ValidateXml(@"D:\Sample.xml", 
                              @"D:\SampleSchema.xsd", 
                              @"http://www.w3.org/2001/XMLSchema", 
                              typeof(note));

Дополнительная информация:

1 голос
/ 03 января 2011

Вы можете сделать что-то вроде этого.

public class XmlValidator
{
    private bool _isValid = true;

    public bool Validate(string xml)
    {
        _isValid = true;

        // Set the validation settings as needed.
        var settings = new XmlReaderSettings { ValidationType = ValidationType.Schema };
        settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
        settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
        settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
        settings.ValidationEventHandler += ValidationCallBack;

        var reader = XmlReader.Create(new StringReader(xml), settings);

        while(reader.Read())
        {
            // process the content if needed
        }

        return _isValid;
    }

    private void ValidationCallBack(object sender, ValidationEventArgs e)
    {
        // check for severity as needed
        if(e.Severity == XmlSeverityType.Error)
        {
            _isValid = false;
        }
    }
}

class Program
{

    static void Main(string[] args)
    {
        var validator = new XmlValidator();

        var result =
            validator.Validate(@"<?xml version=""1.0""?>
                 <Product ProductID=""1"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:noNamespaceSchemaLocation=""schema.xsd"">
                     <ProductName>Chairs</ProductName>
                 </Product>");

}

Схема.

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <xsd:element name="Product">
      <xsd:complexType>
         <xsd:sequence>
            <xsd:element name="ProductName" type="xsd:string"/>
         </xsd:sequence>
         <xsd:attribute name="ProductID" use="required" type="xsd:int"/>
      </xsd:complexType>
   </xsd:element>
</xsd:schema>
...