Przepisuję kod, który używa XmlDocument do parsowania niektórych XML. Chcę zamiast tego użyć XmlReader, aby sprawdzić, czy mogę uzyskać poprawę wydajności. Struktura XML wygląda następująco:Używanie klasy XmlReader do parsowania XML z elementami o tej samej nazwie
<items>
<item id="1" desc="one">
<itemBody date="2012-11-12" />
</item>
<item id="2" desc="two">
<itemBody date="2012-11-13" />
</item>
<item id="3" desc="three">
<itemBody date="2012-11-14" />
</item>
<item id="4" desc="four">
<itemBody date="2012-11-15" />
</item>
</items>
Zasadniczo muszę iterację wszystkich <item>
elementów. Tak jak mówiłem, stary kod działa tak:
XmlDocument document = new XmlDocument();
// load XML into XmlDocument
document.LoadXml(xml);
// use xpath to split into individual item
string xPath = @"items/item";
XmlNodeList nodeList = document.SelectNodes(xPath);
// loop through each item
for (int nodeIndex = 0; nodeIndex < nodeList.Count; nodeIndex++)
{
// do something with the XmlNode
nodeList[nodeIndex];
}
Działa to dobrze, ale myślę, że przy użyciu XmlReader byłoby szybciej. Więc pisałem tak:
XmlReader xmlReader = XmlReader.Create(new StringReader(xml));
while (xmlReader.Read())
{
if (xmlReader.Name.Equals("item") && (xmlReader.NodeType == XmlNodeType.Element))
{
string id = xmlReader.GetAttribute("id");
string desc = xmlReader.GetAttribute("desc");
string elementXml = xmlReader.ReadOuterXml();
}
}
Jednak ten kod odczytuje tylko pierwszy <item>
element. ReadOuterXml() przerywa pętlę. Czy ktoś wie, jak sobie z tym poradzić? Czy ten typ analizy nie jest możliwy z XmlReader? Ja mając to zrobić przy użyciu wersji .NET 2 :(Więc nie mogę używać LINQ
Co dzieje się po pierwszym elemencie? Jakie debugowanie zrobiłeś? Czy Twój oryginalny kod * faktycznie * jest zbyt wolny? (Nie pisz trudniejszego kodu po prostu * potencjalnie * przyspieszaj rzeczy, jeśli są już wystarczająco szybkie ...) –
to nie jest odpowiedź, ale ... czy użyłeś xsd2code? Jest bardzo przydatne do parsowania xml do klas –
Jaka jest zwracana wartość tego? new StringReader (xml) .ReadToEnd() – laszlokiss88