我的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();
}
}
有人可以帮忙吗?
答案 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值,则将值节点转换为字符串。