我如何使用Linq从xml(其中一个元素具有零个或多个相同类型的元素)构建ac#对象?

gf131072

我正在尝试解析一个大致如下所示的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+策略元素。我是不是该:

  • 定义一个新的类Policy {Type,Name,Result}
  • 将List成员添加到Request类
  • 作为Linq查询的一部分创建新的Request对象时以某种方式填充此列表

这是莫名其妙地咬我卡上。我是否需要在现有Select中添加另一个Linq查询,如果是,那会是什么样?c.Descendents(“ policy”)...

马辛·侏罗纪

您进展顺利!您的观点是正确的。您需要一个Policy类和一个类中的List<Policy>属性Request这样,您需要在现有查询中添加一个子查询来填充它们:

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()
    };

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何定位具有相同类的一个元素?

如何使用javascript一次关闭具有相同类的一个元素

多个具有相同类的元素-仅在最后一个元素之后插入

如何使用js删除或重命名具有相同类的多元素的第一个元素?

一个元素上有多个相同类型的注释?

从多个源文件构建内核模块,其中一个与模块具有相同的名称

如何使用WebDriverWait()访问Selenium Python中具有相同类名称的下一个元素的值

使用CSS,如何按其类修改子元素而不影响具有相同类但父元素稍有不同的另一个子元素

r如果我有两个具有相同内容的独立组,如何删除其中一个?

如何使用Go将具有不同类型的一个元素的数组封送为JSON?

在显示第一个元素之后隐藏具有相同类的元素

选择CSS中具有相同类的另一个元素之前的元素

给具有相同类的两个元素一个唯一的 id

我如何找到在同一个列表中并且具有相同类但在 selenium 中的按钮上具有不同文本的按钮元素?

如何通过DI注入两个相同类型但具有一个属性不同的对象?

具有相同类的几个元素。但我只能得到第一个,为什么?

C ++:我有两个数组,其中第一个元素和最后一个元素具有相同的内存地址

两个元素之间的边距,其中一个元素具有“位置:固定”;

堆叠,但其中一个元素应使用Expanded()

JS隐藏所有具有相同类的元素,除了一个

只有一个具有相同类名的元素的点击事件

在 JavaScript 中 - 选择具有相同类的所有元素 - 除了单击一个

如何使用jQuery检查具有相同类的多个元素?

如何使用xpath区分具有相同类的多个元素

如何.concat具有至少一个相同元素的多个数组?

css如何为具有相同类名的另一个元素的子类指定样式

如何使用相同的参数类型重载函数但其中一个可以为空

TypeScript:如何使用变量推断的类型在类外部定义具有相同类型的另一个变量

XPath:获取其中一个子元素具有特定条件的元素