使用外部实体文件在C#中处理XML

Rya*_*ger 6 c# xml special-characters

我在C#中处理一个XML文件(不包含任何dtdent声明),其中包含é和等实体à.尝试加载XML文件时收到以下异常...

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(record);
Run Code Online (Sandbox Code Playgroud)

提及未申报实体'eacute'.

我能够追踪正确的ENT文件在这里.加载XML文件时如何告诉XmlDocument使用此ent文件?

ren*_*ene 3

在 .Net 4 之前的框架版本中,您使用ProhibitDtdXmlReaderSettings 实例。

var settings = new XmlReaderSettings();

settings.ProhibitDtd = false;

string DTD = @"<!DOCTYPE doc [
    <!ENTITY % iso-lat1 PUBLIC ""ISO 8879:1986//ENTITIES Added Latin 1//EN//XML""
    ""http://www.oasis-open.org/docbook/xmlcharent/0.3/iso-lat1.ent"">
    %iso-lat1;
    ]> ";

string xml = string.Concat(DTD,"<xml><txt>ren&eacute;</txt></xml>");

XmlDocument xd = new XmlDocument();
xd.Load(XmlReader.Create(new MemoryStream(
        UTF8Encoding.UTF8.GetBytes(xml)), settings));
Run Code Online (Sandbox Code Playgroud)

从 .Net 4.0 开始,使用具有在 XmlTextReader 上设置的DtdProcessing值的属性。DtdProcessing.Parse

XmlDocument xd = new XmlDocument();
using (var rdr = new XmlTextReader(new StringReader(xml)))
{
    rdr.DtdProcessing = DtdProcessing.Parse;
    xd.Load(rdr);
}     
Run Code Online (Sandbox Code Playgroud)