簡體   English   中英

使用LINQ查詢XML屬性

[英]Querying XML attributes using LINQ

我在一個簡單的XML文檔中為我的應用設置,如下所示:

<Settings>
    <Server>
        <Id>1</Id>
        <Name>SRV123456</Name> 
        <Par Type="Desktop" Region="Western">12</Par>
        <Par Type="Laptop" Region="Western">15</Par>
        <Par Type="Desktop" Region="Eastern">22</Par>
        <Par Type="Laptop" Region="Eastern">25</Par>
        <State>WA</State>
    </Server>
</Settings>

並嘗試使用C#和LINQ使用以下代碼查詢它:

xelement = XElement.Load(startpath + "\\Settings.xml");
var sn = from sl in xelement.Elements("Server")
       where (string)sl.Element("State") == "WA"
       where (string)sl.Element("Par").Attribute("Region") == "Western"
       where (string)sl.Element("Par").Attribute("Type") == "Desktop"
       select sl;

       foreach (XElement xele in sn)
       {
               Console.WriteLine(xele);
               Console.WriteLine(xele.Element("Par").Value);
       }

這適用於第一個“ Par”值,並將返回“ 12”。 但是如果我改變

   where (string)sl.Element("Par").Attribute("Type") == "Desktop"

   where (string)sl.Element("Par").Attribute("Type") == "Laptop"

它不返回任何結果...我想念什么?

這是一個有效且看起來更漂亮的查詢:

var parValue = xdoc.Descendants("Par")
    .Where(par=>par.Parent.Element("State")?.Value == "WA")
    .Where(par=>par.Attribute("Region")?.Value == "Western")
    .Where(par=>par.Attribute("Type")?.Value == "Laptop")
    .Select(par=>par.Value)
    .FirstOrDefault();

注意?。 是CS6的功能,只是省略了? 如果使用CS5,請根據需要檢查是否為null

我絕不是LINQ的專家

然而

    var sn = from sl in xelement.Elements("Server")
           where (string)sl.Element("State") == "WA"
           where (string)sl.Element("Par").Attribute("Region") == "Western"
           where (string)sl.Element("Par").Attribute("Type") == "Desktop"
           select sl;

我相信只返回其中Attribute(“ Type”)==“ Desktop”的元素,意味着只返回等於“ Desktop”的那些元素...因此,當您循環執行時,結果集中沒有任何元素

改成

    var sn = from sl in xelement.Elements("Server")
             where (string)sl.Element("State") == "WA"
             where (string)sl.Element("Par").Attribute("Region") == "Western"
              select sl;

它應該返回所有類型...而不僅僅是“桌面”

也許您正在嘗試返回Western / Laptop值= 15?

var state  = "WA";
var region = "Western";
var type   = "Laptop";
var xElement = XElement.Parse(@"<Settings>
    <Server>
        <Id>1</Id>
        <Name>SRV123456</Name> 
        <Par Type='Desktop' Region='Western'>12</Par>
        <Par Type='Laptop' Region='Western'>15</Par>
        <Par Type='Desktop' Region='Eastern'>22</Par>
        <Par Type='Laptop' Region='Eastern'>25</Par>
        <State>WA</State>
    </Server>
</Settings>");

foreach (XElement server in xElement.XPathSelectElements(
            String.Format("//Server[State='{0}']", state)))
{
    Console.WriteLine(server);

    // In your sample the Western/Desktop is the first element
    // If you want a specific Par element, you should query again with that filter
    foreach (XElement par in server.XPathSelectElements(
                String.Format("Par[@Region='{0}' and @Type='{1}']", region, type)))
        Console.WriteLine(par.Value); ;
}

我選擇XPath而不是Linq來過濾XML文檔,因為XPath在我看來更為簡潔。

暫無
暫無

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

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