【发布时间】: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 个
<ns>元素。 “CounterSales”是第三个<ns>,所以索引等于2。在下一次foreach运行中,“CounterBlah5”在第五个<ns>。所以 index 等于 4。
标签: c# .net xml visual-studio-2010 .net-4.0