Tôi đang viết lại một số mã sử dụng XmlDocument để phân tích cú pháp một số XML. Tôi muốn sử dụng một XmlReader thay vì để xem tôi có thể nhận được một số cải tiến hiệu suất. Cấu trúc của XML trông như thế này:Sử dụng lớp XmlReader để phân tích XML bằng các phần tử có cùng tên
<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>
Về cơ bản, tôi cần phải lặp qua tất cả các yếu tố <item>
. Như tôi đã nói, các mã cũ làm việc như thế này:
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];
}
này hoạt động tốt, nhưng tôi nghĩ rằng sử dụng một XmlReader sẽ nhanh hơn. Vì vậy, tôi đã viết điều này:
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();
}
}
Tuy nhiên, mã này chỉ đọc phần tử <item>
đầu tiên. ReadOuterXml() đang phá vỡ vòng lặp. Có ai biết làm thế nào để có được xung quanh này? Hay kiểu phân tích cú pháp này không thể thực hiện được với XmlReader? Tôi đã phải làm điều này sử dụng phiên bản .NET 2 :(Vì vậy, tôi không thể sử dụng LINQ
Điều gì xảy ra sau yếu tố đầu tiên? Bạn đã sửa lỗi gì? Mã gốc của bạn có thực sự * quá chậm không? (Không viết mã khó hơn chỉ để * có khả năng * làm cho mọi thứ nhanh hơn nếu chúng đã đủ nhanh ...) –
đây không phải là một phản hồi, nhưng ... bạn có sử dụng xsd2code không? Rất hữu ích khi phân tích cú pháp xml thành các lớp –
Giá trị trả về của giá trị này là bao nhiêu? new StringReader (xml) .ReadToEnd() – laszlokiss88