如何在C#中针对DTD验证XML文档?

时间:2009-11-01 21:07:01

标签: c# xml validation dtd

我不想做任何花哨的事情,我只想确保文档有效,如果不是,则打印错误信息。谷歌向我指出this,但似乎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);

4 个答案:

答案 0 :(得分:4)

您应该构建一个合适的XmlValidatingReader class,并将其作为参数传递给XmlReaderSettings object,而不是直接创建XmlReader.Create method

var settings = new XmlReaderSettings { ValidationType = ValidationType.DTD };
settings.ValidationEventHandler += new ValidationEventHandler(OnValidationEvent);
var reader = XmlReader.Create("file.xml", settings);

其余的没有改变。

P.S。 OnValidationEvent是您声明用于处理验证事件的方法的名称。显然,如果您不想订阅由XmlReader引发的验证事件,则可以删除该行。

答案 1 :(得分:2)

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 Expressions

Type Inference

答案 2 :(得分:0)

我已经在DTD验证中提到了这个示例。 https://docs.microsoft.com/en-us/dotnet/api/system.xml.xmlreadersettings.dtdprocessing?view=netcore-3.1#input

此示例包含无效的DTD XML,我已如下进行更正。

<!--XML file using a DTD-->
<!DOCTYPE store [
  <!ELEMENT store (item)*> 
  <!ELEMENT item (name,dept,price)>
  <!ATTLIST item type CDATA #REQUIRED ISBN CDATA 
#REQUIRED>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT dept (#PCDATA)>
  <!ELEMENT price (#PCDATA)>]>
<store>
  <item type="supplies"  ISBN="2-3631-4">
    <name>paint</name>
    <dept>1</dept>
    <price>16.95</price>
  </item>
</store>

答案 3 :(得分:-1)

完整描述:

  1. 在Visual Studio .NET中,创建一个新的Visual C#控制台应用程序 名为ValidateXml的项目。在开头添加两个using语句 Class1.cs的内容如下:

    using System.Xml;        // for XmlTextReader and XmlValidatingReader
    using System.Xml.Schema; // for XmlSchemaCollection (which is used later)
    
  2. Class1.cs中,声明一个名为isValid的布尔变量 开始Main方法如下:

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

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

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

    v.ValidationEventHandler += 
       new ValidationEventHandler(MyValidationEventHandler);
    
  6. 添加以下代码以读取和验证XML文档。如果有的话 发生验证错误,调用MyValidationEventHandler 解决错误。此方法将isValid设置为false(请参阅步骤8)。 您可以在验证后检查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. MyValidationEventHandler方法之后写Main方法 如下:

    public static void MyValidationEventHandler(object sender, 
                                                ValidationEventArgs args) 
    {
       isValid = false;
       Console.WriteLine("Validation event\n" + args.Message);
    }
    
  8. 构建并运行应用程序。应用程序应报告XML文档有效。 的 e.g: 在Visual Studio .NET中,修改ProductWithDTD.xml以使其无效(例如,删除<AuthorName>M soliman</AuthorName>元素)。 再次运行该应用程序。您应该收到以下错误消息:

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