2010-08-17 6 views
7

Sto cercando di leggere un documento XML senza espandere le entità, apportare alcune manipolazioni ad esso e ri-salvarlo con le entità non espanse come erano inizialmente.Evita XmlTextReader da entità espandibili

Quando si utilizza direttamente l'XDocument, non riesce a caricare, un'eccezione mi dica che ha espanso entità:

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

Eccezione: riferimento a un'entità non dichiarata 'EntityName'.

Poi ho cercato di passare il XmlTextReader al costruttore XDocument, ma la proprietà EntityHandling non avere "nessuna espandere":

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

Inoltre, ho guardato la funzione XmlReader.Create, ma MSDN dice: "i lettori creati con il metodo Crea espandono tutte le entità".

Come posso creare un XmlReader che non espanda entità o che abbia un XDocument con entità non espanse?

risposta

-3

decasteljau! La cosa divertente che ho trovato il tuo post alla ricerca di come risolvere il mio problema. E il mio problema era legato al caso in cui le entità non sono affatto risolte. Quindi grazie per la risposta alla mia domanda. E la seguente è la risposta alla tua domanda: per favore, usa 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

Questo non ha senso. – harpo

3

Di seguito ha lavorato per me. Il tasto utilizza la riflessione per impostare il valore di una proprietà 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, questo ha funzionato per me come un fascino. – Sung