7

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

4 回答 4

6

您应该构造一个适当的对象并将其作为参数传递给方法,而不是直接创建XmlValidatingReaderXmlReaderSettingsXmlReader.Create

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

其余不变。

PSOnValidationEvent是您声明用于处理验证事件的方法的名称。显然,如果您不想订阅由XmlReader.

于 2009-11-01T21:17:09.960 回答
3
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.
}

验证事件处理程序

Lambda 表达式

类型推断

于 2009-11-01T21:38:48.047 回答
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>
于 2020-08-25T12:27:10.880 回答
-1

详细描述:

  1. 在 Visual Studio .NET 中,创建一个名为ValidateXml. 在 Class1.cs 开头添加两个 using 语句,如下所示:

    using System.Xml;        // for XmlTextReader and XmlValidatingReader
    using System.Xml.Schema; // for XmlSchemaCollection (which is used later)
    
  2. 在中,在方法开始之前Class1.cs声明一个布尔变量,如下所示:isValidMain

    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 或 Schema)。将此属性设置为 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);
    }
    

构建并运行应用程序。应用程序应该报告 XML 文档是有效的。 例如: 在 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
于 2013-05-26T08:53:30.997 回答