C#XML解析 - 找到元素的位置并读取下一个元素

时间:2013-11-19 04:20:31

标签: c# xml xslt

您好我有一个示例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。请帮帮我。

2 个答案:

答案 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));
}