【问题标题】:Why I get error when I load XML file with XmlDocument?为什么我在使用 XmlDocument 加载 XML 文件时出现错误?
【发布时间】:2019-08-03 15:55:47
【问题描述】:

我有一个类似的 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note SYSTEM "Note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget &xyz me this weekend!</body>
</note>

这里说 &xyz 是一个在 Note.dtd 文件中声明的实体。但是当我尝试这个时,它给了我一个错误 - 引用未声明的实体 'xyz'。

XmlDocument doc = new XmlDocument();
doc.Load(filePath);  // Error is thrown at this line

XmlDocument 不检查外部引用的 dtds 吗?如何解决这个问题?

【问题讨论】:

  • DTD 是否在正确的位置?这个文件的内容是什么样的?
  • 不应该是&amp;xyz;,末尾有分号才有效吗?
  • 参见维基:en.wikipedia.org/wiki/…

标签: c# xml dtd xmldocument


【解决方案1】:

要加载 XmlDocument 并根据 DTD 进行验证并解析实体,您需要配置 XmlReader 以进行验证。

这是一个适用于您的 XML 文件的示例

using System;
using System.Xml;
using System.Xml.Schema;

namespace DtdValidation
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.DtdProcessing = DtdProcessing.Parse;
            settings.ValidationType = ValidationType.DTD;
            settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
            settings.XmlResolver = new XmlUrlResolver();

            XmlDocument doc = new XmlDocument();
            XmlReader reader = XmlReader.Create("data.xml", settings);
            doc.Load(reader);
        }

        // Display any validation errors.
        private static void ValidationCallBack(object sender, ValidationEventArgs e)
        {
            Console.WriteLine("Validation Error: {0}", e.Message);
        }
    }
}

这是我使用的 DTD,它声明了 xyz 实体

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
<!ENTITY xyz "->">

原始答案 - 我最初误读了这个问题

&amp;amp; 是 XML 中的一个特殊字符,因此当您想要包含文字 & 时,您需要使用 &amp;amp; 对其进行编码 以下是您可能会遇到的其他编码

< &lt;
> &gt;
& &amp
" &quot;
' &apos;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-22
    • 2021-03-11
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多