[英]How to read attribute values from XML and combine them to one string
編輯:到目前為止,建議的答案對我不起作用。 也許我的榜樣有點誤導。 我已經更新了XML以及期望的字符串以供參考。 我可以多次出現具有不同級別的節點,並且在每個級別中可以有一個或多個子節點。
我有一個具有以下結構的XML文件:
<VariableCollection>
<Variable Name="Level1">
<Variable Name="Level2">
<Variable Name="Level3">
<Variable Name="Level4"/>
<Variable Name="Level41"/>
</Variable>
</Variable>
</Variable>
<Variable Name="Level11">
<Variable Name="Level21">
<Variable Name="Level31">
<Variable Name="Level41"/>
<Variable Name="Level42"/>
<Variable Name="Level43"/>
</Variable>
</Variable>
</Variable>
<Variable Name="Level1">
<Variable Name="Level2">
<Variable Name="Level3"/>
</Variable>
</Variable>
<Variable Name="Level11">
<Variable Name="Level21">
<Variable Name="Level31"/>
</Variable>
</Variable>
<Variable Name="Level1">
<Variable Name="Level2"/>
</Variable>
<Variable Name="Level11">
<Variable Name="Level21"/>
</Variable>
</VariableCollection>
因此,我的節點具有不同的結構化子級別/子節點。 我想做的是使用LINQ to XML讀取整個文件,並從每個“子節點”的“名稱”屬性創建的每個“主節點”獲得一個字符串。 因此結果應如下所示:
string1 = "Level1.Level2.Level3.Level4"
string11 = "Level1.Level2.Level3.Level41"
string2 = "Level11.Level21.Level31.Level41"
string22 = "Level11.Level21.Level31.Level42"
string23 = "Level11.Level21.Level31.Level43"
string3 = "Level1.Level2.Level3"
string3 = "Level11.Level21.Level31"
string4 = "Level1.Level2"
string5 = "Level11.Level21"
我的問題是我不知道如何完成這項工作。 誰能給我一個例子,說明如何完成此工作?
您可以執行以下操作:
var root = XDocument.Parse(xml);
var strings = root.Root.Elements()
.Select(e => String.Join(".", e.DescendantsAndSelf().Select(c => (string)c.Attribute("Name"))))
.ToArray();
在這里,我使用XElement.Elements()
遍歷根元素<VariableCollection>
的直接子元素,然后對每個元素使用DescendantsAndSelf()
遞歸地下降其元素層次結構,以選擇嵌套查詢中的Name
屬性,然后將值與String.Join()
。
小提琴的例子。
我使用了“自下而上”的方法。 第一步是查找沒有嵌套元素的變量(代碼中的lastLvl
)。 第二步是遍歷到根和連接名稱。 以下代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;
using System.Collections;
public class Program
{
public static void Main()
{
var @s =
@"<VariableCollection>
<Variable Name='Level1'>
<Variable Name='Level2'>
<Variable Name='Level3'>
<Variable Name='Level4'/>
<Variable Name='Level41'/>
</Variable>
</Variable>
</Variable>
<Variable Name='Level11'>
<Variable Name='Level21'>
<Variable Name='Level31'>
<Variable Name='Level41'/>
<Variable Name='Level42'/>
<Variable Name='Level43'/>
</Variable>
</Variable>
</Variable>
<Variable Name='Level1'>
<Variable Name='Level2'>
<Variable Name='Level3'/>
</Variable>
</Variable>
<Variable Name='Level11'>
<Variable Name='Level21'>
<Variable Name='Level31'/>
</Variable>
</Variable>
<Variable Name='Level1'>
<Variable Name='Level2'/>
</Variable>
<Variable Name='Level11'>
<Variable Name='Level21'/>
</Variable>
</VariableCollection>";
var xml = XElement.Parse(@s);
var lastLvl = xml.Descendants("Variable").Where(x => !x.HasElements);
Console.WriteLine(String.Join(Environment.NewLine, lastLvl));
var names = lastLvl.Select(x => String.Join(".", x.AncestorsAndSelf("Variable").Select(e=>(string)e.Attribute("Name")).Reverse()));
Console.WriteLine();
Console.WriteLine(String.Join(Environment.NewLine, names));
}
}
生成輸出:
lastLevel:
<Variable Name="Level4" />
<Variable Name="Level41" />
<Variable Name="Level41" />
<Variable Name="Level42" />
<Variable Name="Level43" />
<Variable Name="Level3" />
<Variable Name="Level31" />
<Variable Name="Level2" />
<Variable Name="Level21" />
名稱:
Level1.Level2.Level3.Level4
Level1.Level2.Level3.Level41
Level11.Level21.Level31.Level41
Level11.Level21.Level31.Level42
Level11.Level21.Level31.Level43
Level1.Level2.Level3
Level11.Level21.Level31
Level1.Level2
Level11.Level21
嘗試演示小提琴
您可以使用XElement
來解析和遍歷文檔,如下所示:
string xml = @"
<VariableCollection>
<Variable Name=""Level1"">
<Variable Name=""Level2"">
<Variable Name=""Level3"">
<Variable Name=""Level4""/>
</Variable>
</Variable>
</Variable>
<Variable Name=""Level1"">
<Variable Name=""Level2"">
<Variable Name=""Level3""/>
</Variable>
</Variable>
<Variable Name=""Level1"">
<Variable Name=""Level2""/>
</Variable>
</VariableCollection>
";
var root = XElement.Parse(xml);
var stringList = new List<string>();
foreach (var child in root.Elements())
{
string value = child.DescendantsAndSelf()
.Select(i => i.Attribute("Name").Value)
.Aggregate((a, b) => a + "." + b);
stringList.Add(value);
}
foreach (var str in stringList)
Console.WriteLine(str.ToString());
如果要從文件加載,請使用以下代碼:
var root = XElement.Load("filepath");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.