簡體   English   中英

如何使用Linq從xml構建ac#對象,其中元素具有零個或多個相同類型的元素?

[英]How can I use Linq to build a c# object from xml where an element has zero or more elements of the same type?

我正在嘗試解析一個看起來大致如下的xml文件:

<?xml version="1.0" encoding="utf-16" ?>
<log>
    <request id="1" result="Deny">
        <user name="corp\joe"/>
        <session number="1"/>
        <file name="xyz"/>
        <policy type="default" name="Default Rules" result="Deny"/>
        <policy type="adgroup" name="Domain Users" result="Allow"/>
    </request>
        <request id="1" result="Deny">
        <user name="corp\joe"/>
        <session number="1"/>
        <file name="abc"/>
        <policy type="default" name="Default Rules" result="Deny"/>
        <policy type="device" name="laptop12" result="Deny"/>
    </request>
</log>

請注意每個請求都存在多個策略元素。

到目前為止,這是我的代碼:

public class Request
{
   public int Request_id { get; set; }
   public string User_name { get; set; }
   public string Session_number { get; set; }
   public string File_name { get; set; }
}

void Main()
{
    var xml = XDocument.Load(@"c:\temp\test.xml");

    var query = from c in xml.Descendants("request")
        where (String)c.Attribute("result") == "Deny"
        select new Request() {
            Request_id = (int) c.Attribute("id"),
            User_name = (string) c.Element("user").Attribute("name"),
            Session_number = (string) c.Element("session").Attribute("number"),
            File_name = (string) c.Element("file").Attribute("name"),
        };

    foreach (Request r in query.ToList()) {
        System.Diagnostics.Debug.WriteLine(r.User_name + "," + r.File_name);
    }
}

我不確定如何查詢和捕獲0+策略元素。 我是不是該:

  • 定義新的類策略{類型,名稱,結果}
  • 將List成員添加到Request類
  • 以Linq查詢的一部分創建新的Request對象時,以某種方式填充此列表

這是我堅持不懈的一點點。 我是否需要在現有Select中添加另一個Linq查詢,如果是,那會是什么樣子? c.Descendents( “政策”)...

你處在非常好的軌道上! 你的觀點是正確的。 您需要Request類中的Policy類和List<Policy>屬性。 有了它,您需要在現有查詢中使用子查詢來填充它們:

var query = from c in xml.Descendants("request")
    where (String)c.Attribute("result") == "Deny"
    select new Request() {
        Request_id = (int) c.Attribute("id"),
        User_name = (string) c.Element("user").Attribute("name"),
        Session_number = (string) c.Element("session").Attribute("number"),
        File_name = (string) c.Element("file").Attribute("name"),
        Policies = (from p in c.Elements("policy")
                    select new Policy() {
                        Type = (string) p.Attribute("type")
                        // (...)
                    }).ToList()
    };

暫無
暫無

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

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