XmlReader在读取时解析DTD实体,可以禁用吗?

时间:2018-05-23 09:03:53

标签: c# .net xml

我有一个定义实体的XML文档

<!DOCTYPE resources [
    <!ENTITY EntityOne "The First">
    <!ENTITY EntityTwo "The Second">
]>

...然后在文档正文中使用这些实体。

<resources>
    <string name="r1">&EntityOne; is getting mapped to the string/string>
    <string name="r2">&EntityTwo; is also getting mapped to the string</string>
</resources>

然而,当我使用XmlReader阅读文档时,实体总是在文本中被替换为文本,即&amp; EntityOne;出现在&#34; The First&#34;在xml体中。有什么方法可以阻止这种情况发生,以便保留实体吗?

1 个答案:

答案 0 :(得分:0)

正如评论中正确指出的那样,XmlReader类没有公共API来处理这个问题,与具有XmlTextReader属性的旧EntityHandling不同。如果您无法切换到XmlTextReader - 您可以使用反射设置XmlReader.Create返回的私有实现字段来实现此结果。显然,依靠私有实现细节并不是一个好主意,但如果你别无选择 - 你可以这样做:

var settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;                        
using (var reader = XmlReader.Create(new StringReader(yourXml), settings)) {
    // get private field
    var eh = reader.GetType().GetField("entityHandling", BindingFlags.Instance | BindingFlags.NonPublic);
    // prevent expansion of DTD entities, char entities are still expanded
    eh.SetValue(reader, EntityHandling.ExpandCharEntities);
    while (reader.Read()) {
        // do stuff
    }
}