我有一个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?该问题如何解决?
答案 0 :(得分: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 "->">
原始答案-我最初误读了问题
&
是XML中的特殊字符,因此当您要包含文字时,需要使用&
对其进行编码
这是您可能会遇到的其他编码
< <
> >
& &
" "
' '