c# - 为什么我在使用 XmlDocument 加载 XML 文件时出现错误?
问题描述
我有一个 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 吗?如何解决这个问题?
解决方案
要加载 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 "->">
原始答案 - 我最初误读了这个问题
The&
是 XML 中的一个特殊字符,因此当您想要包含文字 & 时,您需要使用&
以下方法对其进行编码:这是您可能遇到的其他编码
< <
> >
& &
" "
' '
推荐阅读
- terraform - 如何在 terraform 输出变量中附加到根模块中的列表?
- r - 通过字符变量将一列分成两列
- php - 将使用 FPDF 创建的 pdf 插入/保存到数据库中
- javascript - 有没有办法让 chrome 扩展在标签之间独立运行?
- assembly - 在调用 printf 的循环中与 nasm 中的 mul 相乘 - 结果意外增长
- vb.net - VB.net 中的数据网格视图值
- java - 在 html 的帮助下在 java 中创建一个多色的 JLabel
- ios - 如何阅读符号化的崩溃日志?
- javascript - 上传前压缩文件
- javascript - 如何在 CSS 样式中使用 JavaScript 变量?