代码之家  ›  专栏  ›  技术社区  ›  Coppermill

使用XSD架构验证XML,而不使用C更改XML#

  •  2
  • Coppermill  · 技术社区  · 14 年前

    我有一个XML文件,在XML中没有模式,我需要根据XSD模式验证XML。我看到过许多示例,您将XSD注入到XML中,然后验证XML。我不想更改XML,是否可以在不更改XML的情况下根据架构验证XML?

    3 回复  |  直到 14 年前
        1
  •  3
  •   Assaf Lavie    14 年前

    用C编写代码很容易。

    我创建了一个简单的命令行接口实用程序,它接受两个参数:XML、XSD和验证。

    你可以下载它 here .

    主要代码如下:

                // 1- Read XML file content
                reader = new XmlTextReader(XMLPath);
    
                // 2- Read Schema file content
                StreamReader SR = new StreamReader(XSDPath);
    
                // 3- Create a new instance of XmlSchema object
                XmlSchema Schema = new XmlSchema();
                // 4- Set Schema object by calling XmlSchema.Read() method
                Schema = XmlSchema.Read(SR,
                    new ValidationEventHandler(ReaderSettings_ValidationEventHandler));
    
                // 5- Create a new instance of XmlReaderSettings object
                XmlReaderSettings ReaderSettings = new XmlReaderSettings();
                // 6- Set ValidationType for XmlReaderSettings object
                ReaderSettings.ValidationType = ValidationType.Schema;
                // 7- Add Schema to XmlReaderSettings Schemas collection
                ReaderSettings.Schemas.Add(Schema);
    
                // 8- Add your ValidationEventHandler address to
                // XmlReaderSettings ValidationEventHandler
                ReaderSettings.ValidationEventHandler +=
                    new ValidationEventHandler(ReaderSettings_ValidationEventHandler);
    
                // 9- Create a new instance of XmlReader object
                XmlReader objXmlReader = XmlReader.Create(reader, ReaderSettings);
    
    
                // 10- Read XML content in a loop
                while (objXmlReader.Read())
                { /*Empty loop*/}
    
        2
  •  1
  •   Sam    14 年前

    您可以将架构添加到XML文档

    doc.Schemas.Add(schema);
    

    然后验证它

    bool xmlvalid = true;
    string lastXmlError = "";
    
    doc.Validate(new System.Xml.Schema.ValidationEventHandler(
        delegate(object sender, System.Xml.Schema.ValidationEventArgs args)
        {
            if (args.Severity == System.Xml.Schema.XmlSeverityType.Error)
                {
                    xmlvalid = false;
                    lastXmlError = args.Message;
                }
        }));
    
    if (!xmlvalid)
       //raise error
    
        3
  •  1
  •   code4life    14 年前

    仅当要在第一个验证错误之后继续验证文档时,才提供validationEventHandler。否则,只需执行以下操作:

    private bool ValidateDocument(string xmlFile, string xsdFile)
    {
        XmlReaderSettings settings = new XmlReaderSettings{ValidationType 
          = ValidationType.Schema};
        settings.Schemas.Add(XmlSchema.Read(XmlReader.Create(xsdFile)));
        XmlReader reader = XmlReader.Create(xmlFile, settings);
    
        try
        {
            while(reader.Read());
            return true;
        }
        catch (XmlException ex) 
        {
            // XmlException indicates a validation error occurred.
            return false;
        }
    }
    

    以下链接提供了详细信息:

    http://msdn.microsoft.com/en-us/library/1xe0740a.aspx

    http://support.microsoft.com/kb/307379