Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Prevent XmlTextReader from expanding entities

I am trying to read a XML document without expanding the entities, do some manipulations to it, and re-save it with the unexpanded entities as they were initially.

When using the XDocument directly, it fails to load, throwing an exception tell me it has unexpanded entities:

XDocument doc = XDocument.Load(file);  // <--- Exception
// ... do some manipulation to doc
doc.Save(file2);

Exception: Reference to undeclared entity 'entityname'.

Then I tried to pass the XmlTextReader to the XDocument constructor, but the EntityHandling property does not have "no expand":

XmlTextReader xmlReader = new XmlTextReader(file));
xmlReader.EntityHandling = EntityHandling.ExpandCharEntities;
XDocument doc = XDocument.Load(xmlReader);

Also, I have looked at the XmlReader.Create function, but MSDN says: "readers created by the Create method expand all entities".

How can I create a XmlReader that does not expand entities, or have a XDocument with entities not expanded?

like image 959
decasteljau Avatar asked Aug 17 '10 15:08

decasteljau


1 Answers

The following worked for me. The key is using reflection to set the value of an internal property DisableUndeclaredEntityCheck.

XmlDocument document = new XmlDocument();
XmlReaderSettings readerSettings = new XmlReaderSettings()
{
    DtdProcessing = DtdProcessing.Ignore,
    IgnoreWhitespace = true,
};
using (XmlReader reader = XmlReader.Create(inputPath, readerSettings))
{
    PropertyInfo propertyInfo = reader.GetType().GetProperty("DisableUndeclaredEntityCheck", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
    propertyInfo.SetValue(reader, true);
    document.Load(reader);
}
like image 81
Sam Harwell Avatar answered Oct 19 '22 03:10

Sam Harwell