使用LINQ选择XML中的特定节点
本文关键字:节点 LINQ 选择 XML 使用 | 更新日期: 2023-09-27 18:06:33
我正在编写一个函数,用于加载XML文档并将其转换为CSV。因为我只需要XML文件中的一些值,所以我试图实现的目标是只选择我感兴趣的节点。
下面是我的代码:
XDocument csvDocument = XDocument.Load(tempOutput);
StringBuilder csvBuilder = new StringBuilder(1000);
foreach (XElement node in csvDocument.Descendants("Sample"))
{
foreach (XElement innerNode in node.Elements())
{
csvBuilder.AppendFormat("{0},", innerNode.Value);
}
csvBuilder.Remove(csvBuilder.Length -1, 1);
csvBuilder.AppendLine();
}
csvOut = csvBuilder.ToString();
但是,通过这种方式,我选择了"Sample"节点内的所有子节点。
在XML中,"Sample"树是:
<Sample Type="Object" Class ="Sample">
<ID>1</ID>
<Name>10096</Name>
<Type>2</Type>
<Rep>0</Rep>
<Selected>True</Selected>
<Position>1</Position>
<Pattern>0</Pattern>
</Sample>
代码工作完美,但我只需要"ID"answers"Selected"被选中和他们的值写入CSV文件内。
谁能给我指个正确的方向?谢谢。
点击这里了解更多有关Linq-to-xml的信息。你并没有真正地利用XObject
s的"连锁性"
var samples = csvDocument.Descendants("Sample")
.Select(el => new {
Id = el.Element("ID").Value,
Selected = el.Elemnt("Selected").Value
});
这将为您创建一个IEnumerable<T>
,其中'T'
是具有属性Id
和Selected
的匿名类型。您可以为类型安全解析(int.Parse
或bool.Parse
) Id和Selected值。但因为你只是写一个StringBuilder
对象,你可能不关心…仅供参考。
StringBuilder对象可以这样写:
foreach (var sample in samples) {
csvBuilder.AppendFormat(myFormattedString, sample.Id, sample.Selected);
}
需要注意的是,匿名对象和for-each
循环应该在同一个作用域中。但如果有必要,还是有办法的。
一如既往,剥猫皮的方法不止一种。
…参考注释:
foreach (XElement node in csvDocument.Descendants("Sample"))
{
foreach (XElement innerNode in node.Elements())
{
// this logic assumes different formatting for values
// otherwise, change if statement to || each comparison
if(innerNode.Name == "ID") {
// append/format stringBuilder
continue;
}
if(innerNode.Name == "Selected") {
// append/format stringBuilder
continue;
}
}
csvBuilder.Remove(csvBuilder.Length -1, 1);
csvBuilder.AppendLine();
}