XmlReader
sé lettura sostegno del frammento XML - cioè
var settings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment };
using (var reader = XmlReader.Create("fragment.xml", settings))
{
// you can work with reader just fine
}
Tuttavia XDocument.Load
non supporta la lettura di XML frammentato.
Il modo rapido e sporco consiste nel disporre i nodi sotto una radice virtuale prima di richiamare lo XDocument.Parse
. Ad esempio:
Questo approccio è limitato ai file xml di piccole dimensioni, in quanto è necessario leggere prima il file in memoria; e concatenare una stringa di grandi dimensioni significa spostare grandi oggetti nella memoria, il che è meglio evitare.
se le cose di performance si dovrebbe essere la lettura nodi in XDocument
one-by-one tramite XmlReader
come spiegato in ottime @ risposta s' Martin-Honnen (https://stackoverflow.com/a/18203952/2440262)
Se si utilizza API che dà per scontato che XmlReader
itera su XML valido, e le questioni di prestazioni, è possibile utilizzare l'approccio-stream aderito invece:
using (var jointStream = new MultiStream())
using (var openTagStream = new MemoryStream(Encoding.ASCII.GetBytes("<root>"), false))
using (var fileStream =
File.Open(@"fragment.xml", FileMode.Open, FileAccess.Read, FileShare.Read))
using (var closeTagStream = new MemoryStream(Encoding.ASCII.GetBytes("</root>"), false))
{
jointStream.AddStream(openTagStream);
jointStream.AddStream(fileStream);
jointStream.AddStream(closeTagStream);
using (var reader = XmlReader.Create(jointStream))
{
// now you can work with reader as if it is reading valid xml
}
}
MultiStream - vedi ad esempio https://gist.github.com/svejdo1/b9165192d313ed0129a679c927379685
Nota: XDocument
carica l'intero xml in memoria. Quindi non utilizzarlo per file di grandi dimensioni - invece utilizzare XmlReader
per iterazione e carico solo i bit croccanti come XElement
via XNode.ReadFrom(...)
fonte
2013-08-12 11:54:28
'XDocument.Load' non funziona, perché quel tipo di file non è un documento XML valido. – MarcinJuraszek
Puoi pubblicare il codice che hai provato finora? – christiandev
Domanda diversa, stessa risposta: http://stackoverflow.com/a/9378442 – dtb