C# XML验证如何根据XSD工作?

13 浏览
0 Comments

C# XML验证如何根据XSD工作?

我有一个具有指定模式位置的XML文件,例如:

xsi:schemaLocation="someurl ..\localSchemaPath.xsd"

我想在C#中进行验证。当我在Visual Studio中打开该文件时,它会根据模式对其进行验证并完美地列出错误。但是,不知何故,我似乎无法在C#中自动验证它,而无需指定要验证的模式,像这样:

XmlDocument asset = new XmlDocument();
XmlTextReader schemaReader = new XmlTextReader("relativeSchemaPath");
XmlSchema schema = XmlSchema.Read(schemaReader, SchemaValidationHandler);
asset.Schemas.Add(schema);
asset.Load(filename);
asset.Validate(DocumentValidationHandler);

难道我不能自动验证XML文件中指定的模式吗?我错过了什么吗?

0
0 Comments

C#如何对XML进行XSD验证?

在使用.NET 3.5版本中,可以使用XDocument和XmlSchemaSet进行简化的验证。

XmlSchemaSet schemas = new XmlSchemaSet();

schemas.Add(schemaNamespace, schemaFileName);

XDocument doc = XDocument.Load(filename);

string msg = "";

doc.Validate(schemas, (o, e) => {

msg += e.Message + Environment.NewLine;

});

Console.WriteLine(msg == "" ? "Document is valid" : "Document invalid: " + msg);

此方法要求您事先知道模式,而不是从xml中获取内联模式。

当XML文档包含一些HTML标签时,如"my new catalog....",此方法会正常工作,但会抛出错误。在这种情况下,像"<i>"这样的HTML标签会造成问题,因为它是"<catalog>"的值...如何验证它?

如果您希望将HTML放入XML文档中,您需要将其包装在CDATA中。" new catalog....]]>"是正确的方法。

简单而优雅!当针对固定模式集进行验证时(这就是我们的情况,一个包含多个文件和文件夹的大型模式集),这种方法非常有效。我已经考虑将XmlSchemaSet缓存起来,在调用验证器之间重复使用。非常感谢!

当XSD中的默认命名空间与XML中的不同时,它无法工作。

0
0 Comments

C# XML验证与XSD的工作原理是什么?

在C#中,我们可以使用XSD(XML Schema Definition)来验证XML文档的有效性。验证XML文档的有效性是一种确保文档符合特定结构和规范的方法。

为了验证XML文档与XSD的匹配性,我们可以使用以下代码:

public bool ValidateSchema(string xmlPath, string xsdPath)
{
    XmlDocument xml = new XmlDocument();
    xml.Load(xmlPath);
    xml.Schemas.Add(null, xsdPath);
    try
    {
        xml.Validate(null);
    }
    catch (XmlSchemaValidationException)
    {
        return false;
    }
    return true;
}

这段代码首先创建一个XmlDocument对象,然后通过调用`Load`方法加载XML文档。接下来,我们通过调用`Schemas.Add`方法将XSD架构添加到XmlDocument对象的架构集合中。最后,我们使用`Validate`方法对XML文档进行验证。如果XML文档与XSD不匹配,则会抛出一个XmlSchemaValidationException异常。

这种验证方法是同步的,意味着在验证过程中程序会阻塞,直到验证完成。如果验证失败,则返回false;如果验证成功,则返回true。

此外,我们还可以通过使用回调函数来获得有关验证错误的更多信息。回调函数可以告诉我们哪一行的XML文档不正确。这种方法是一种二进制的验证方式,要么正确,要么错误。

通过捕获XmlSchemaValidationException异常,我们可以获取异常消息,以便进一步调试和处理验证错误。

总结起来,C# XML验证与XSD的工作原理是通过将XSD添加到XmlDocument对象的架构集合中,然后使用Validate方法对XML文档进行验证。验证过程中,如果发现不匹配,则会抛出XmlSchemaValidationException异常。我们可以通过回调函数获取更多有关验证错误的信息。这种验证方法是一种同步的方式,可以确保XML文档的有效性。

0
0 Comments

C#中的XML验证是通过使用XmlReader和XmlReaderSettings来实现的。首先需要创建一个XmlReaderSettings实例,并在创建XmlReader时将其传递给它。然后可以订阅设置中的ValidationEventHandler以接收验证错误。代码示例如下:

using System.Xml;
using System.Xml.Schema;
using System.IO;
public class ValidXSD
{
    public static void Main()
    {
        // 设置验证设置
        XmlReaderSettings settings = new XmlReaderSettings();
        settings.ValidationType = ValidationType.Schema;
        settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
        settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
        settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
        settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
        // 创建XmlReader对象
        XmlReader reader = XmlReader.Create("inlineSchema.xml", settings);
        // 解析文件
        while (reader.Read()) ;
    }
    // 显示警告或错误
    private static void ValidationCallBack(object sender, ValidationEventArgs args)
    {
        if (args.Severity == XmlSeverityType.Warning)
            Console.WriteLine("\tWarning: Matching schema not found. No validation occurred." + args.Message);
        else
            Console.WriteLine("\tValidation error: " + args.Message);
    }
}

如果要与XSD文件进行比较,可以在上述代码中添加以下行:settings.Schemas.Add("YourDomainHere", "yourXSDFile.xsd")。

如果要获取错误的行号和位置,请在ValidationCallBack中使用args.Exception.LineNumber。

如果要比较的模式没有命名空间,可以使用settings.Schemas.Add(null, "path to xsd file")。

以上就是C#中对XML进行XSD验证的方法。

0