C# XML验证如何根据XSD工作?
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文件中指定的模式吗?我错过了什么吗?
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标签时,如"
如果您希望将HTML放入XML文档中,您需要将其包装在CDATA中。"
简单而优雅!当针对固定模式集进行验证时(这就是我们的情况,一个包含多个文件和文件夹的大型模式集),这种方法非常有效。我已经考虑将XmlSchemaSet缓存起来,在调用验证器之间重复使用。非常感谢!
当XSD中的默认命名空间与XML中的不同时,它无法工作。
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文档的有效性。
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验证的方法。