c# - 从 .Net v4.5 升级到 .Net v4.5.2 后未声明元素验证错误

标签 c# .net xml dtd

我知道已经有很多关于 XML 验证的“找不到元素”错误的线程,但我发布这个是因为我的问题略有不同。

在 .Net v4.5 上之前,我的代码运行良好。将框架升级到 v4.6.1 后,我的 xml 文件中的每个 XML 元素开始出现此错误。降级后,我发现错误从 .Net framework v4.5.2 开始出现。下面是我的代码:

XML - Book.xml

<?xml version="1.0" ?>
<!DOCTYPE book SYSTEM "Book.dtd">
<book>
    <title>The Lord of the Rings</title>
    <author>J.R.R. Tolkien</author>
    <isbn>1572810556</isbn>
</book>

DTD - Book.dtd

<!ELEMENT book (title, author, isbn)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT isbn (#PCDATA)>

C# 函数

public static void ReadXMLwithDTD()
{
    // Set the validation settings.
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.ValidationType = ValidationType.DTD;
    settings.DtdProcessing = DtdProcessing.Parse;
    settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
    settings.IgnoreWhitespace = true;

    // Create the XmlReader object.
    XmlReader reader = XmlReader.Create("Book.xml", settings);

    // Parse the file.
    while (reader.Read())
    {
        Console.WriteLine("{0}, {1}: {2} ", reader.NodeType, reader.Name, reader.Value);
    }
}

private static void ValidationCallBack(object sender, ValidationEventArgs e)
{
    if (e.Severity == XmlSeverityType.Warning)
        Console.WriteLine("Warning: Matching schema not found.  No validation occurred." + e.Message);
    else // Error
        Console.WriteLine("Validation error: " + e.Message);
}

当运行代码时,回调会抛出所有四个 XML 元素(书籍、书名、作者和 isbn)的验证错误(未找到元素)。

任何解决此问题的帮助将不胜感激。

谢谢,

最佳答案

我参加聚会有点晚了,但我想我已经通过在之前添加以下代码找到了解决方案 settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);

settings.XmlResolver = new XmlUrlResolver();

从 .NET Framework 4.5.2 开始,此设置的默认值为 null。

引用:https://msdn.microsoft.com/en-us/library/system.xml.xmlreadersettings.xmlresolver(v=vs.110).aspx

关于c# - 从 .Net v4.5 升级到 .Net v4.5.2 后未声明元素验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36460672/

相关文章:

c# - 这个傅立叶变换实现有什么问题

c# - ASP.NET Core 3.1 URL 链接到需要授权的页面,给出错误防伪 token 验证失败

java - 如何查看Word标题中的空间量?

sql - 选择具有命名空间的列作为 XML

c# - 基于模板的 XML 到 CSV 转换

C# 代码优先迁移,向上/向下?

c# - 预测 base64 编码 byte[] 的字节大小

c# - 如何在新的 .NET Framework 4.6 中启用 SIMD?

c# - array 和 List<> 哪个更好?

c# - 在 WPF 中仅使用 XAML 根据 TextBox 的文本过滤 ListBox 的项目