2013-04-04 22 views
7

Piszę xml z XmlWriter. Mój kod ma wiele odcinków tak:Jak sprawdzić nazwę elementu za pomocą WriteEndElement

xml.WriteStartElement("payload"); 
ThirdPartyLibrary.Serialise(results, xml); 
xml.WriteEndElement(); // </payload> 

Problem polega na tym, że metoda jest zawodna ThirdPartyLibrary.Serialise. Może się zdarzyć (w zależności od zmiennej results), że nie zamyka wszystkich otwartych znaczników. W konsekwencji moja linia WriteEndElement jest zboczona, zużyta, zamykając wiszące znaczniki biblioteki, zamiast pisać </payload>.

Tak więc chciałbym wykonać sprawdzone wywołanie funkcji WriteEndElement, która sprawdza nazwę elementu, i zgłasza wyjątek, chyba że kursor znajduje się w oczekiwanym elemencie.

xml.WriteEndElement("payload"); 

Można myśleć o tym jak XmlReader.ReadStartElement(name) który rzuca chyba że kursor znajduje się w oczekiwanym miejscu w dokumencie.

Jak mogę to osiągnąć?


Edycja: Drugim przypadkiem użycia dla tej metody rozszerzenia byłoby uczynienie mojego własnego kodu bardziej czytelnym i niezawodnym.

+0

Czy możesz wysłać nowy 'XmlWriter' do' ThirdPartyLibrary.Serialise' i sprawdzić, czy nie jest to proste przed dodaniem go do twojego obiektu 'xml'? – zimdanen

+0

Czy potrafisz jakoś potwierdzić 'wyniki' przed przekazaniem go do' Serialise'? (tzn. czy można przepisać przerwanie serializowanej metody, gdy przechodzisz w określone typy wyników)? – keyboardP

+0

@KeyboardP - trzecia biblioteka jest faktycznie dostarczoną przez użytkownika wtyczką implementującą interfejs, więc nie można jej ufać. –

Odpowiedz

0

W końcu napisałem metodę EXTENTION WriteSubtree który daje tę użytkową API:

using (var resultsXml = xml.WriteSubtree("Results")) 
{ 
    ThirdPartyLibrary.Serialise(results, resultsXml); 
} 

Metoda rozszerzenie XmlWriter.WriteSubtree jest analogiczna do .NET na XmlReader.ReadSubtree. Zwraca specjalny XmlWriter, który sprawdza przeciwko zabawnym firmom. Jego metoda usuwania zamyka wszystkie pozostawione tagi.

1

XMLWriter zapisuje dane danego xml w strumieniu bez jakiejkolwiek weryfikacji. Jeśli podczas sprawdzania znaczników XML wystąpi jakakolwiek weryfikacja, problem z wydajnością pojawi się podczas tworzenia dużego pliku xml.

Utworzenie pliku XML za pomocą XMLWriter może być spowodowane ryzykiem dewelopera. Jeśli chcesz wykonać taki rodzaj sprawdzania poprawności, możesz użyć XMLDocument.

Jeśli naprawdę chcesz zrobić to sprawdzanie poprawności w XMLWriter, musisz utworzyć pisarz za pomocą String lub StringBuilder. Ponieważ, jeśli używasz Stream lub TextWriter, nie możesz odczytać informacji zapisanych w strumieniu w trakcie pisania. W każdej aktualizacji pliku XML należy przeczytać ciąg znaków i napisać własną metodę sprawdzania poprawności zapisanych informacji.

Proponuję użyć XMLDocument do tworzenia tego typu xml.

Powiązane problemy