您好我有一个示例xml如下
<ROOTELEMENT>
<RECORDSET>
<ROW><VALUE>AAA</VALUE></ROW>
<ROW><VALUE>0</VALUE></ROW>
<ROW><VALUE>00</VALUE></ROW>
<ROW><VALUE>BBB</VALUE></ROW>
<ROW><VALUE>1</VALUE></ROW>
<ROW><VALUE>2</VALUE></ROW>
<ROW><VALUE>CCC</VALUE></ROW>
<ROW><VALUE>3</VALUE></ROW>
<ROW><VALUE>30</VALUE></ROW>
</RECORDSET>
<RECORDSET>
<ROW><VALUE>DDD</VALUE></ROW>
<ROW><VALUE>4</VALUE></ROW>
<ROW><VALUE>40</VALUE></ROW>
<ROW><VALUE>EEE</VALUE></ROW>
<ROW><VALUE>5</VALUE></ROW>
<ROW><VALUE>6</VALUE></ROW>
<ROW><VALUE>FFF</VALUE></ROW>
<ROW><VALUE>7</VALUE></ROW>
<ROW><VALUE>70</VALUE></ROW>
</RECORDSET>
</ROOTELEMENT>
我必须获得具有一些VALUE的特定ROW的位置。在那之后,我必须从那个位置开始读取特定数量的ROW的值。 例如:如果我将某个值设为'BBB',为此我必须得到接下来的两个值'1'和'2'。如果我给出一些值为'FFF',为此我必须得到接下来的两个值'7'和'70'。 我正在使用.Net framework2.0。我不能使用LINQ。请帮帮我。
答案 0 :(得分:2)
您可以使用以下代码。它遍历节点并将您期望的值存储在foundValues
string valueToFind = "FFF";
string xml = @"<ROOTELEMENT>
<RECORDSET>
<ROW><VALUE>AAA</VALUE></ROW>
<ROW><VALUE>0</VALUE></ROW>
<ROW><VALUE>00</VALUE></ROW>
<ROW><VALUE>BBB</VALUE></ROW>
<ROW><VALUE>1</VALUE></ROW>
<ROW><VALUE>2</VALUE></ROW>
<ROW><VALUE>CCC</VALUE></ROW>
<ROW><VALUE>3</VALUE></ROW>
<ROW><VALUE>30</VALUE></ROW>
</RECORDSET>
<RECORDSET>
<ROW><VALUE>DDD</VALUE></ROW>
<ROW><VALUE>4</VALUE></ROW>
<ROW><VALUE>40</VALUE></ROW>
<ROW><VALUE>EEE</VALUE></ROW>
<ROW><VALUE>5</VALUE></ROW>
<ROW><VALUE>6</VALUE></ROW>
<ROW><VALUE>FFF</VALUE></ROW>
<ROW><VALUE>7</VALUE></ROW>
<ROW><VALUE>70</VALUE></ROW>
</RECORDSET>
</ROOTELEMENT>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
int count = 0;
List<string> foundValues = new List<string>();
foreach (XmlNode root in doc.ChildNodes)
foreach (XmlNode recorset in root.ChildNodes)
foreach (XmlNode row in recorset.ChildNodes)
foreach (XmlNode value in row.ChildNodes)
{
if (value.InnerText == valueToFind || count == 1 || count == 2)
{
if (count == 1 || count == 2)
foundValues.Add(value.InnerText);
count++;
}
}
答案 1 :(得分:0)
迟到了,但这是Linq to XML替代方案:
private static string getXML()
{
return @"<ROOTELEMENT>
<RECORDSET>
<ROW><VALUE>AAA</VALUE></ROW>
<ROW><VALUE>0</VALUE></ROW>
<ROW><VALUE>00</VALUE></ROW>
<ROW><VALUE>BBB</VALUE></ROW>
<ROW><VALUE>1</VALUE></ROW>
<ROW><VALUE>2</VALUE></ROW>
<ROW><VALUE>CCC</VALUE></ROW>
<ROW><VALUE>3</VALUE></ROW>
<ROW><VALUE>30</VALUE></ROW>
</RECORDSET>
<RECORDSET>
<ROW><VALUE>DDD</VALUE></ROW>
<ROW><VALUE>4</VALUE></ROW>
<ROW><VALUE>40</VALUE></ROW>
<ROW><VALUE>EEE</VALUE></ROW>
<ROW><VALUE>5</VALUE></ROW>
<ROW><VALUE>6</VALUE></ROW>
<ROW><VALUE>FFF</VALUE></ROW>
<ROW><VALUE>7</VALUE></ROW>
<ROW><VALUE>70</VALUE></ROW>
</RECORDSET>
</ROOTELEMENT>";
}
private static void parseXML()
{
var xmlString = getXML();
var xml = XDocument.Parse(xmlString);
var values = xml.Descendants("VALUE");
var groups = values.Select((value, index) => new
{
Index = index,
Value = value
})
.GroupBy(x => x.Index / 3)
.Select(g => new Tuple<XElement, XElement, XElement>(g.ElementAt(0).Value,
g.ElementAt(1).Value,
g.ElementAt(2).Value));
}