2

我有以下格式的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();

            }


        }

有人可以帮忙吗?

4

2 回答 2

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 文档的整个结构中搜索匹配的元素。

于 2013-01-17T20:01:13.997 回答
0

非常简单System.Xml.XPath.Extensions

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

值将IEnumerable<double>包含原始值元素的值。结果将是所有值的串联字符串。顺便说一句,您的 xml 中缺少根元素。

更新

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

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

于 2013-01-17T20:14:32.657 回答