【发布时间】:2018-06-17 20:28:11
【问题描述】:
我创建了一个名为 test1.xml 的 XML 文档,该文档链接到定义了实体 circ 的外部 dtd mydtd2.dtd。两个文件都保存在同一个文件夹中。但是当使用 XmlReader 读取 XML 文件时,我收到错误 Reference to undeclared entity circ.
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE test1 SYSTEM "mydtd2.dtd">
<test1>
print this character ˆ
</test1>
<!ELEMENT test1 >
<!ENTITY circ "^">
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
settings.CheckCharacters = false;
XmlDocument doc = new XmlDocument();
using (XmlReader reader = XmlReader.Create(filename, settings))
{
doc.Load(reader);
}
当我在内部将实体添加到 XML 文件的顶部时,它可以工作。
<?xml version="1.0" standalone="yes" ?>
<!DOCTYPE wow [
<!ENTITY circ "^" >
]>
<test1>
wow can this work ( j ˆy )
</test1>
【问题讨论】:
-
您需要设置
XmlReaderSettings.XmlResolver但这样做存在安全风险,因为您最终可能会从外部站点加载恶意内容。要开始使用,您可以查看 How do I resolve entities when loading into an XDocument? 和 How to prevent XXE attack ( XmlDocument in .net)。 -
我不需要为我的外部 DTD 加载公共 URI。我有自己的私有 DTD,与 XML 文档在同一个文件夹中。
-
嗯,我找不到表明这一点的现有答案。您可以从 Resolving the Unknown: Building Custom XmlResolvers in the .NET Framework 和 Customizing the XmlUrlResolver Class 开始。
-
我使用 XmlResolver 让它工作我只是使用了默认设置,只是通过在设置中创建它,DTD 文档被拉入并且 XML 文档现在可以找到它。
-
XmlUrlResolver 解析器 = new XmlUrlResolver();解析器.Credentials = CredentialCache.DefaultCredentials; settings.XmlResolver = 解析器;