簡體   English   中英

如何從XML讀取屬性值並將其組合為一個字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM