簡體   English   中英

使用LINQ選擇XML中的特定節點

[英]Select specific nodes in XML with LINQ

我正在編寫一個加載和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();

但是,通過這種方式,我選擇了“示例”節點內的所有子節點。

在XML中,“樣本”樹為:

<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”和“ Selected”並將它們的值寫入CSV文件即可。

有人能指出我正確的方向嗎?

謝謝。

在此處了解有關Linq-to-xml的更多信息。 您並沒有真正利用XObject的“ linq-edness”

var samples = csvDocument.Descendants("Sample")
                         .Select(el => new {
                             Id = el.Element("ID").Value,
                             Selected = el.Elemnt("Selected").Value
                         });

這會為您創建IEnumerable<T> ,其中'T'是具有屬性IdSelected匿名類型 您可以解析( int.Parsebool.Parse )Id和Selected值以確保類型安全。 但是由於您只是在寫一個StringBuilder對象,所以您可能不在乎...只是一個FYI。

然后可以將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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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