XML读取重复与父c#同名的子元素

时间:2013-01-17 19:58:17

标签: c# xml linq linq-to-xml

我的xml格式如下:

<rows>
   <rows>
      <primitiveValue>000</primitiveValue>
   </rows>
   <rows>
      <primitiveValue>58316</primitiveValue>
   </rows>
   <rows>
   <primitiveValue>133083.0</primitiveValue>
   </rows>
</rows>
<rows>
  <rows>
    <primitiveValue>001</primitiveValue>
  </rows>
  <rows>
    <primitiveValue>66018</primitiveValue>
  </rows>
  <rows>
    <primitiveValue>172546.0</primitiveValue>
  </rows>
</rows>

我需要按行的每个父元素拆分数据,但不知道如何执行此操作。

我已经尝试了下面的代码,但这会遍历每个行的实例并导致重复。

        string Values = "";

        foreach (XElement element in xDoc.Descendants("rows"))
        {

            foreach (XElement childElement in element.Descendants("rows").Elements("primitiveValue"))
            {

                Values = Values + "," + childElement.Value.ToString();

            }


        }

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

后代将找到具有您正在寻找的名称的所有节点,无论它们在XML树的下方有多远。尝试尝试这样的事情:

foreach (XElement element in xDoc.Children("rows"))
        {
            foreach (XElement childElement in element.Descendants("rows").Elements("primitiveValue"))
            {
                Values = Values + "," + childElement.Value.ToString();
            }
        }

关键是使用Children只应返回直接位于根元素下面的节点,而不是在XML文档的整个结构中搜索匹配的元素。

答案 1 :(得分:0)

使用System.Xml.XPath.Extensions非常简单:

var values = xdoc.XPathSelectElements(@"//rows/rows/primitiveValue").Select(v => (double)v);
string result = String.Join(",", values);

值为IEnumerable<double>,包含primitiveValue元素的值。结果将是所有值的串联字符串。顺便说一句,你在xml中缺少root元素。

更新

IEnumerable<string> result = 
             xdoc.Root.Elements("rows")
                 .Select(r => String.Join(",", r.Descendants("primitiveValue")
                                                .Select(v => (double)v)));

这将返回字符串序列,每个字符串将包含内部行的连接值。如果需要原始字符串而不是double值,则将值节点转换为字符串。