Witam. Aplikacja na wejściu otrzymuje plik XML w postaci:
<?xml version="1.0" encoding="windows-1250"?>
<ROOT>
<RECORDSET1>
<RECORD USR="user@przyklad.pl" />
</RECORDSET1>
<RECORDSET2>
<RECORD atr="..." />
</RECORDSET2>
<RECORDSET3>
<RECORD atr="..." />
</RECORDSET3>
</ROOT>
- Interesuje nas odczyt atrybutu USR. Zawsze będzie to w gałęzi ROOT/RECORDSET1/RECORD. Napisałem taki kod:
string filename = ""; // to mamy dane
string usrName; //tę zmienną chcemy wypełnić danymi.
XPathDocument iDocument = new XPathDocument(filename);
XPathNavigator navigator = iDocument.CreateNavigator();
XPathNodeIterator nodeIterator = navigator.Select("/ROOT/RECORDSET1/RECORD");
nodeIterator.MoveNext();
XPathNavigator node = nodeIterator.Current;
smtpServer = node.GetAttribute("USR", "");
Działa.
W toku działania aplikacji muszę się jeszcze parę razy odwoływać do konkretnego argumentu w konkretnej gałęzi dokumentu. Za każdym razem jest ona jednoznacznie i dokładnie określona.
Mogę to oczywiście opakować w funkcję, nie mogę jednak oprzeć się wrażeniu, że strzelam z armaty do muchy. Da się jakoś prościej (i krócej!) dobrać do interesującej nas wartości?
-
Wydaje mi się (chociaż nie dam sobie za to uciąć nogi), że powyższy kod po zakończeniu wciąż trzyma otwarty plik. Obiekt XPathDocument nie ma metody close() ani żadnej podobnej, a po jego zakończeniu pliku nie da się usunąć (dopóki działa aplikacja)...
-
W innym miejscu - mam wczytany ten plik do obiektu XmlDocument:
XmlTextReader iFile = new XmlTextReader(oldFileName);
XmlTextWriter oFile = new XmlTextWriter(newFileName);
XmlDocument document = new XmlDocument();
document.Load(iFile);
//jakieś-tam nieporadne przekształcenia na dokumencie
document.WriteTo(oFile);
oFile.Flush();
iFile.Close();
oFile.Close();
Też działa, ale dokument wynikowy zapisywany jest w utf-16, ale z pozostawioną oryginalną deklaracją kodowania. Mogę co prawda po zakończeniu tego użyć streamreadera/writera, otworzyć plik ponownie, podmienić pierwszą linijkę i zapisać... Ale to już będzie parodia.
Jak, mając wczytany plik do obiektu XmlDocument, zmienić w nim początkową deklarację?
Dziękuję za odpowiedzi i pozdrawiam.