如何在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表达式

类型推断

详细描述:

  1. 在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) 
  2. Class1.cs ,在Main方法的开始之前声明一个名为isValid的布尔变量,如下所示:

     private static bool isValid = true; // If a validation error occurs, // set this flag to false in the // validation event handler. 
  3. 创建一个XmlTextReader对象以从Main方法中的文本文件中读取XML文档,然后创建一个XmlValidatingReader以validation此XML数据,如下所示:

     XmlTextReader r = new XmlTextReader("C:\\MyFolder\\ProductWithDTD.xml"); XmlValidatingReader v = new XmlValidatingReader(r); 
  4. XmlValidatingReader对象的ValidationType属性指示所需的validation类型(DTD,XDR或Schema)。 将此属性设置为DTD,如下所示:

     v.ValidationType = ValidationType.DTD; 
  5. 如果发生任何validation错误,validation阅读器将生成validation事件。 添加以下代码以注册validation事件处理程序(您将在步骤7中实现MyValidationEventHandler方法):

     v.ValidationEventHandler += new ValidationEventHandler(MyValidationEventHandler); 
  6. 添加以下代码以读取和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"); 
  7. 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以使其无效(例如,删除M soliman元素)。 再次运行该应用程序。 您应该收到以下错误消息:

 Validation event Element 'Product' has invalid content. Expected 'ProductName'. An error occurred at file:///C:/MyFolder/ProductWithDTD.xml(4, 5). Document is invalid