2010-08-17 12 views
7

Estoy tratando de leer un documento XML sin expandir las entidades, hacerle algunas manipulaciones y volver a guardarlo con las entidades no expandidas como estaban inicialmente.Evite que XmlTextReader expanda entidades

Cuando se utiliza el XDocument directamente, no se carga, lanzando una excepción dime que ha expandidas entidades:

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

Excepción: Referencia a la entidad no declarada 'entityname'.

Luego trató de pasar el XmlTextReader a la XDocument constructor, pero la propiedad EntityHandling no tiene "ninguna ampliar":

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

Además, he mirado la función XmlReader.Create, pero MSDN dice: "los lectores creados por el método Create expanden todas las entidades".

¿Cómo puedo crear un XmlReader que no expanda entidades, o tener un XDocument con entidades no expandidas?

Respuesta

-3

decasteljau! Lo curioso es que encontré tu publicación buscando cómo resolver mi problema. Y mi problema estaba relacionado con el caso cuando las entidades no se resuelven en absoluto. Así que gracias por la respuesta a mi pregunta. Y la siguiente es la respuesta a su pregunta: por favor, use XmlDocument.

XDocument document = XDocument.Load("test.xml"); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; using (XmlWriter writer = XmlWriter.Create(Console.Out, settings)) { document.WriteTo(writer); } Console.WriteLine();

+2

Esto no tiene sentido. – harpo

3

Los siguientes trabajó para mí. La clave es usar la reflexión para establecer el valor de una propiedad interna 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); 
} 
+0

Woah, esto funcionó para mí como un encanto. – Sung

Cuestiones relacionadas