Próbuję przetworzyć duży dokument XML (używając XmlReader
) w jednym przebiegu i deserializować tylko niektóre elementy w nim za pomocą XmlSerializer
.Usuwanie pojedynczego elementu z dużego dokumentu XML: xmlSerializer.Deserialize (xmlReader.ReadSubtree()) kończy się niepowodzeniem z powodu problemów z obszarami nazw
Poniżej znajduje się kod i mały, fałszywy dokument XML pokazujący, w jaki sposób próbowałem to zrobić.
uzasadnienie dla korzystania
XmlReader
:1. mam do czynienia z bardzo dużych dokumentów XML (10 – 250 MB), które z tego powodu nie chcę, aby załadować do pamięci. Tak więcXmlDocument
jest wykluczone. 2. Chcę wyodrębnić tylko niektóre elementy. Zazwyczaj będę mógł zignorować większość innych treści.XmlReader
wydaje mi się skutecznym sposobem na pomijanie nieistotnych treści. 3. Nie wiem z góry, czy będą obecne wszystkie elementy, z którymi będę mógł sobie poradzić; w związku z tym nie używam kilka zXpath
/XQuery
lub LINQ do kwerend opartych na XML, ponieważ chcę zrobić tylko jedno przejście przez pliki XML (ze względu na ich rozmiar).
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());
Ostatnia linia kodu generuje po wewnętrznej wyjątek:
InvalidOperationException
: "Namesepace prefiksex
nie jest zdefiniowana"
Oczywiście XmlSerializer
nie rozpoznaje namespace prefix ex
wewnątrz wartości atrybutu xsi:type
.
To tylko jeden błąd, jaki mam, ale prawdę mówiąc, większy problem polega na tym, że nie mam pojęcia, jak rozwiązać problem z całą przestrzenią nazw. Po prostu szukam wygodnego sposobu odserializowania pojedynczego węzła z dokumentu XML, ale wydaje się to wiązać z koniecznością ręcznego rejestrowania/zarządzania obszarami nazw oraz przekazania ich z poziomu XmlReader
do XmlSerializer
.
Czy ktoś może zademonstrować sposób deserializacji pojedynczego węzła z dokumentu XML odczytanego za pomocą XmlReader
, albo wskazując błąd w moim kodzie, albo pokazując alternatywne podejście?
Poszukaj przykładu na 'XmlNamespaceManager'. Oto [jeden] (http://stackoverflow.com/a/14462578/815938), aby rozpocząć. – kennyzx
@kennyzx: Przyjrzałem się 'XmlNamespaceManager' i' XmlNameTable' oraz 'XmlParserContext', a czego nie. Po prostu nie mam pojęcia, jak to ma pasować do mojego scenariusza. Czy mógłbyś zademonstrować mi to wykorzystanie? – stakx