我有一个定义实体的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体中。有什么方法可以阻止这种情况发生,以便保留实体吗?
答案 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
}
}