如何在C#中针对DTDvalidationXML文档?
我不想做任何花哨的事情,我只想确保文档有效,如果没有,则打印错误信息。 Google向我指出了这一点 ,但似乎XmlValidatingReader已经过时了(至少,这是MonoDevelop告诉我的)。
编辑:我正在尝试Mehrdad的提示,但我遇到了麻烦。 我想我已经掌握了大部分内容,但我无法在任何地方找到OnValidationEvent。 我从哪里获得OnValidationEvent?
XmlReaderSettings settings = new XmlReaderSettings(); settings.ValidationType = ValidationType.DTD; settings.ValidationEventHandler += new ValidationEventHandler(/*trouble is here*/); XmlReader validatingReader = XmlReader.Create(fileToLoad, settings);
您应该构造一个适当的XmlReaderSettings
对象并将其作为参数传递给XmlReader.Create
方法 ,而不是直接创建XmlValidatingReader
类 :
var settings = new XmlReaderSettings { ValidationType = ValidationType.DTD }; settings.ValidationEventHandler += new ValidationEventHandler(OnValidationEvent); var reader = XmlReader.Create("file.xml", settings);
其余的没有变化。
PS OnValidationEvent
是您声明用于处理validation事件的方法的名称。 显然,如果您不想订阅XmlReader
引发的validation事件,则可以删除该行。
var messages = new StringBuilder(); var settings = new XmlReaderSettings { ValidationType = ValidationType.DTD }; settings.ValidationEventHandler += (sender, args) => messages.AppendLine(args.Message); var reader = XmlReader.Create("file.xml", settings); if (messages.Length > 0) { // Log Validation Errors // Throw Exception // Etc. }
的ValidationEventHandler
Lambda表达式
类型推断
详细描述:
-
在Visual Studio .NET中,创建名为
ValidateXml
的新Visual C#控制台应用程序项目。 将两个using语句添加到Class1.cs的开头,如下所示:using System.Xml; // for XmlTextReader and XmlValidatingReader using System.Xml.Schema; // for XmlSchemaCollection (which is used later)
-
在
Class1.cs
,在Main
方法的开始之前声明一个名为isValid
的布尔变量,如下所示:private static bool isValid = true; // If a validation error occurs, // set this flag to false in the // validation event handler.
-
创建一个
XmlTextReader
对象以从Main
方法中的文本文件中读取XML文档,然后创建一个XmlValidatingReader
以validation此XML数据,如下所示:XmlTextReader r = new XmlTextReader("C:\\MyFolder\\ProductWithDTD.xml"); XmlValidatingReader v = new XmlValidatingReader(r);
-
XmlValidatingReader
对象的ValidationType
属性指示所需的validation类型(DTD,XDR或Schema)。 将此属性设置为DTD,如下所示:v.ValidationType = ValidationType.DTD;
-
如果发生任何validation错误,validation阅读器将生成validation事件。 添加以下代码以注册validation事件处理程序(您将在步骤7中实现
MyValidationEventHandler
方法):v.ValidationEventHandler += new ValidationEventHandler(MyValidationEventHandler);
-
添加以下代码以读取和validationXML文档。 如果发生任何validation错误,则调用
MyValidationEventHandler
来解决错误。 此方法将isValid
设置为false(请参阅步骤8)。 您可以在validation后检查isValid
的状态,以查看文档是有效还是无效。while (v.Read()) { // Can add code here to process the content. } v.Close(); // Check whether the document is valid or invalid. if (isValid) Console.WriteLine("Document is valid"); else Console.WriteLine("Document is invalid");
-
在
Main
方法之后编写MyValidationEventHandler
方法,如下所示:public static void MyValidationEventHandler(object sender, ValidationEventArgs args) { isValid = false; Console.WriteLine("Validation event\n" + args.Message); }
构建并运行应用程序。 应用程序应报告XML文档有效。 例如:在Visual Studio .NET中,修改ProductWithDTD.xml
以使其无效(例如,删除
元素)。 再次运行该应用程序。 您应该收到以下错误消息:
Validation event Element 'Product' has invalid content. Expected 'ProductName'. An error occurred at file:///C:/MyFolder/ProductWithDTD.xml(4, 5). Document is invalid