【问题标题】:Element is not declared validation error post upgrading from .Net v4.5 to .Net v4.5.2从 .Net v4.5 升级到 .Net v4.5.2 后,元素未声明验证错误
【发布时间】:2016-07-27 10:03:55
【问题描述】:

我知道已经有许多现有线程用于 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)抛出验证错误(未找到元素)。

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

谢谢,

【问题讨论】:

  • 删除项目中的 bin 文件夹,以便重新构建代码。升级网络库依赖项时编译器无法识别。如此简单的解决方案是删除 bin 文件夹,这将强制所有内容重新编译。
  • 试过了,结果一样。谢谢。
  • 尝试更改设置,看看是否有所不同?你是如何生成xml的?是否有类似的代码?您是否在工作时使用相同的xml而不工作?架构是否内置在 xml 文件中?
  • 我应该更改哪些设置? XML 目前是静态文件。是的,相同的 XML 和 DTD 适用于 v4.5,但不适用于 v4.5.2 及更高版本。模式在 DTD 中定义,如上所述。
  • 您是否确认正在读取 DTD?如果在其中引入语法错误,错误信息会改变吗?

标签: c# .net xml dtd


【解决方案1】:

我参加聚会有点晚了,但我想我已经通过添加以下代码找到了解决方案 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 2021-05-14
    相关资源
    最近更新 更多