【问题标题】:Reading several elements using Linq-to-Xml and some loop?使用 Linq-to-Xml 和一些循环读取几个元素?
【发布时间】:2015-09-30 13:55:13
【问题描述】:

使用以下代码,我目前正在阅读每个<nv><ns>CounterSales</ns>(第三个元素),这很棒。我包括代码和 XML。

这是代码,如果 ElementAt 是硬编码的,则效果很好:

var xDoc = XDocument.Parse(xmlStr);
var nvs = xDoc.Descendants("nv");
var nads = nvs.Select(nv => nv.Elements("nad").First().Value).ToList();
var thirdRs = nvs.Select(nv => nv.Elements("r").ElementAt(2).Value).ToList();

这是xmlStr的值:

<ni>
    <nss>20150927</nss>
    <gp>Addon</gp>
    <ns>CounterBlah1</ns>
    <ns>CounterBlah2</ns>
    <ns>CounterSales</ns>
    <ns>CounterBlah4</ns>
    <ns>CounterBlah5</ns>
    <ns>CounterBlah6</ns>
    <nv>
        <nad>Style=1,Rfu=1,Id=132</nad>
        <r>0</r>
        <r>15</r>
        <r>8</r>
        <r>3</r>
        <r>2</r>
        <r>2</r>
    </nv>
    <nv>
        <nad>Style=1,Rfu=1,Id=433</nad>
        <r>0</r>
        <r>15</r>
        <r>30</r>
        <r>3</r>
        <r>2</r>
        <r>2</r>
    </nv>
    <nv>
        <nad>Style=1,Rfu=1,Id=665</nad>
        <r>0</r>
        <r>15</r>
        <r>90</r>
        <r>3</r>
        <r>2</r>
        <r>2</r>
    </nv>
</ni>

但是假设我想阅读多个计数器。我有一个当前有两行的数据表:[CounterSales][CounterBlah5]。我想以同样的方式处理其他两个计数器:

int index = 0;
DataTable results = GetCounters();
//results has two rows: [CounterSales] & [CounterBlah5]

foreach (DataRow row in results.Rows)
{
    string counter = cellRow["counter"]; //counter equals "CounterSales"
    /* Iterate through all <ns> to see where "CounterSales" is located.
       In this case, index = 2. On next foreach, index equals 4  */

    var xDoc = XDocument.Parse(xmlStr);
    var nvs = xDoc.Descendants("nv");
    var nads = nvs.Select(nv => nv.Elements("nad").First().Value).ToList();
    var thirdRs = nvs.Select(nv => nv.Elements("r").ElementAt(index).Value).ToList();
}

感谢任何帮助。

谢谢。

【问题讨论】:

  • 那是什么问题?
  • 我不想将ElementAt 硬编码为一个值(在本例中为 2),而是要检索计数器的实际索引。在此示例中,对于“CounterSales”index = 2;。与“CounterBlah5”,index = 4;
  • 它应该如何知道计数器所在的索引?
  • 在 XML 中,有 6 个&lt;ns&gt; 元素。 “CounterSales”是第三个&lt;ns&gt;,所以索引等于2。在下一次foreach 运行中,“CounterBlah5”在第五个&lt;ns&gt;。所以 index 等于 4。

标签: c# .net xml visual-studio-2010 .net-4.0


【解决方案1】:

如果我正确理解了您的问题,这就是您所需要的

DataTable results = GetCounters();
//results has two rows: [CounterSales] & [CounterBlah5]

foreach (DataRow row in results.Rows)
{
    string counter = cellRow["counter"]; //counter equals "CounterSales"
    /* Iterate through all <ns> to see where "CounterSales" is located.
        In this case, index = 2. On next foreach, index equals 4  */                

    var xDoc = XDocument.Parse(xmlStr);

    //here we find the index
    var requiredIndex = xDoc.Descendants("ns")
            .Select((node, idx) => new { node, idx})
            .First(x => x.node.Value.Equals(counter)).idx;

    var nvs = xDoc.Descendants("nv");
    var nads = nvs.Select(nv => nv.Elements("nad").First().Value).ToList();
    var thirdRs = nvs.Select(nv => nv.Elements("r").ElementAt(requiredIndex).Value).ToList();
}

编辑:从this 帖子中查找List&lt;T&gt; 索引的较短语法。

var requiredIndex = xDoc.Descendants("ns").ToList().FindIndex(x => x.Value == counter);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多