Sto tentando di elaborare un documento XML di grandi dimensioni (utilizzando un XmlReader
) in un unico passaggio e deserializzare solo alcuni elementi in esso utilizzando un XmlSerializer
.Deserializzazione di un singolo elemento in un documento XML di grandi dimensioni: xmlSerializer.Deserialize (xmlReader.ReadSubtree()) non riesce a causa dei problemi dello spazio dei nomi
Di seguito è riportato un codice e un piccolo documento XML fittizio che mostra come ho tentato di farlo.
razionale per l'utilizzo
XmlReader
:1. ho a che fare con i documenti di grandi dimensioni XML (10 – 250 MB), che per questo motivo non voglio caricare in memoria. QuindiXmlDocument
è fuori questione. 2. Voglio estrarre solo determinati elementi. In genere potrò ignorare la maggior parte degli altri contenuti.XmlReader
sembra darmi un mezzo efficace per ignorare i contenuti irrilevanti. 3. Non so in anticipo se saranno presenti tutti gli elementi che posso trattare; quindi non sto usando un mucchio diXpath
/XQuery
o LINQ alle query basate su XML, perché voglio fare solo un passaggio sui file XML (a causa delle loro dimensioni).
public class ElementOfInterest { }
…
var xml = @"<?xml version='1.0' encoding='utf-8' ?>
<Root xmlns:ex='urn:stakx:example'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
<ElementOfInterest xsi:type='ex:ElementOfInterest' />
</Root>";
var reader = System.Xml.XmlReader.Create(new System.IO.StringReader(xml));
reader.ReadToFollowing("ElementOfInterest");
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(ElementOfInterest));
serializer.Deserialize(reader.ReadSubtree());
L'ultima riga di codice genera la seguente eccezione interna:
InvalidOperationException
: "prefisso namespaceex
non è definito."
Ovviamente, il XmlSerializer
non riconosce il prefisso ex
namespace all'interno il valore dell'attributo xsi:type
.
Questo è solo un errore che sto avendo, ma francamente, il problema più grande è che non ho idea di come andare sull'intero problema dello spazio dei nomi. Sto semplicemente cercando un modo conveniente per de-serializzare solo un singolo nodo dal documento XML, ma questo sembra implicare la necessità di registrare/gestire manualmente gli spazi dei nomi e in qualche modo inoltrarli dallo XmlReader
allo XmlSerializer
.
Qualcuno può dimostrare come deserializzare un singolo nodo da un documento XML letto con uno XmlReader
, indicando l'errore nel mio codice o mostrando un approccio alternativo?
Cercare un esempio su 'XmlNamespaceManager'. Ecco [uno] (http://stackoverflow.com/a/14462578/815938) per iniziare. – kennyzx
@kennyzx: ho esaminato 'XmlNamespaceManager' e' XmlNameTable' e 'XmlParserContext', e cosa no. Semplicemente non ho idea di come si debba incastrare nel mio scenario. Potresti manifestare il suo uso per me? – stakx