C# 模式验证XML

C# 模式验证XML,c#,xml,xsd,schema,C#,Xml,Xsd,Schema,我有一个XSD文件和一个XML文件,如何检查XML是否与XSD文件一样位于正确的模式中 我知道XmlDocument类中有一个validate函数,但它需要一个事件处理程序 我所需要的是真是假 另外,我正在使用Invisial Studio 2010。您可以使用XmlReaderSettings类和create方法创建一个正在验证的XmlReader实例 private bool ValidateXml(string xmlFilePath, string schemaFilePath, st

我有一个XSD文件和一个XML文件,如何检查XML是否与XSD文件一样位于正确的模式中

我知道
XmlDocument
类中有一个validate函数,但它需要一个事件处理程序 我所需要的是真是假


另外,我正在使用Invisial Studio 2010。

您可以使用XmlReaderSettings类和create方法创建一个正在验证的XmlReader实例


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是等效类层次结构中根元素的类型


例如: 架构位于:。将文件另存为
D:\SampleSchema.xsd


运行
xsd.exe

  • 打开“开始菜单>所有程序>Microsoft Visual Studio 2010>Visual Studio工具>Visual Studio 2010命令提示符”
  • 在命令提示符中,键入:
    xsd.exe/c/out:D:\“D:\SampleSchema.xsd”
  • xsd选项:
    /out
    选项用于指定输出目录,
    /c
    用于指定生成类的工具
  • 输出类层次结构位于
    D:\SampleSchema.cs
  • 生成的类层次结构如下所示

  • 将该类添加到visual studio项目中。
    对于上面的xsd示例,根类是
    note

    调用该方法

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


      • 你可以这样做

        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>");
        
        }
        
        公共类XmlValidator
        {
        private bool_isValid=true;
        公共bool验证(字符串xml)
        {
        _isValid=true;
        //根据需要设置验证设置。
        var settings=newxmlreadersettings{ValidationType=ValidationType.Schema};
        settings.ValidationFlags |=XmlSchemaValidationFlags.ProcessInlineSchema;
        settings.ValidationFlags |=XmlSchemaValidationFlags.ProcessSchemaLocation;
        settings.ValidationFlags |=XmlSchemaValidationFlags.ReportValidationWarnings;
        settings.ValidationEventHandler+=ValidationCallBack;
        var reader=XmlReader.Create(新的StringReader(xml),设置);
        while(reader.Read())
        {
        //如果需要,处理内容
        }
        返回有效;
        }
        私有void ValidationCallBack(对象发送方,ValidationEventArgs e)
        {
        //根据需要检查严重性
        if(e.Severity==XmlSeverityType.Error)
        {
        _isValid=false;
        }
        }
        }
        班级计划
        {
        静态void Main(字符串[]参数)
        {
        var validator=新的XmlValidator();
        var结果=
        validator.Validate(@)
        椅子
        ");
        }
        
        模式

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

        有一种非常简单的方法:

        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中写这篇文章,所以可能会有不区分大小写的单词,但这些代码是有效的!

        如果不在函数调用中输入所有xml,我怎么做?while循环应该做什么?函数如何使用该方案?您可以传递一个路径到Validate函数并执行'var reader=XmlReader.Create(路径,设置);“而不是”var reader=XmlReader.Create(new StringReader(xml),settings);“好的。但是“while”是什么呢?”循环应该做什么?函数如何使用该方案?while循环解析xml文档,并在这个过程中验证xml。xml包含对架构的引用:a.while循环中需要编写什么代码?b.如果代码中没有对架构的引用,那么它就在属性中。它可以工作吗?这不会由于未设置ValidationFlags,因此无法验证任何内容。这只会反序列化xml。我应该输入什么作为rootType?rootType是从xsd文件创建的类模型的根元素的类型。例如,如果创建类模型(使用.NET的xsd.exe工具),则类型将为“Product”(对于@Steven给出的示例xsd)。使用.NET的xsd工具创建一个类层次结构。例如,如果架构文件位于“D:\testSchema.xsd”,则工具用法应为>xsd/c/out:D:\“D:\testSchema.xsd”。这是一个命令行工具。有关更多信息:啊?与类型的连接是什么?我应该如何编写类型?谢谢,这正是我所需要的!与其他解决方案相比,非常简单,谢谢!
        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;
            }
        }