gpt4 book ai didi

c# - 我如何通过 linq 到 xml 从 xml 获取所有 "properties"

转载 作者:太空狗 更新时间:2023-10-29 23:35:24 26 4
gpt4 key购买 nike

XML 示例(original link):

<records>
<record index="1">
<property name="Username">Sven</property>
<property name="Domain">infinity2</property>
<property name="LastLogon">12/15/2009</property>
</record>
<record index="2">
<property name="Username">Josephine</property>
<property name="Domain">infinity3</property>
<property name="LastLogon">01/02/2010</property>
</record>
<record index="3">
<property name="Username">Frankie</property>
<property name="Domain">wk-infinity9</property>
<property name="LastLogon">10/02/2009</property>
</record>
</records>

我想为 xml 中的每条记录获取一个类的实例。

我在这里找到了类似的例子,但它们只有一个根,然后是一个元素深。它一直有效,直到我将其他元素放入。我希望能够做类似的事情

foreach(Record rec in myVar)
{
Console.WriteLine("ID: {0} User:{1} Domain:{2} LastLogon:{3}",rec.Index, rec.Username, rec.Domain, rec.LastLogon);
}

最佳答案

编辑:使用 ToDictionary 方法更新代码以提高清晰度和效率。

您可以尝试以下示例。如果您从 select new Record 行中删除 Record,它将生成匿名类型并且仍然有效。如果您提供了其他构造函数,您的 Record 类应该有一个默认的无参数构造函数来使用对象初始值设定项(如果您没有构造函数,它也可以工作)。否则,您可以使用可用的构造函数而不是对象初始值设定项。

请注意,Single()Value 的使用假定 XML 格式正确且没有任何缺失元素。

var xml = XElement.Parse(@"<records>
<record index=""1"">
<property name=""Username"">Sven</property>
<property name=""Domain"">infinity2</property>
<property name=""LastLogon"">12/15/2009</property>
</record>
<record index=""2"">
<property name=""Username"">Josephine</property>
<property name=""Domain"">infinity3</property>
<property name=""LastLogon"">01/02/2010</property>
</record>
<record index=""3"">
<property name=""Username"">Frankie</property>
<property name=""Domain"">wk-infinity9</property>
<property name=""LastLogon"">10/02/2009</property>
</record>
</records>");

var query = from record in xml.Elements("record")
let properties = record.Elements("property")
.ToDictionary(p => p.Attribute("name").Value, p => p.Value)
select new Record
{
Index = record.Attribute("index").Value,
Username = properties["Username"],
Domain = properties["Domain"],
LastLogon = properties["LastLogon"]
};

foreach(var rec in query)
{
Console.WriteLine("ID: {0} User:{1} Domain:{2} LastLogon:{3}", rec.Index, rec.Username, rec.Domain, rec.LastLogon);
}

编辑:我已经用更清晰、更快速的 ToDictionary 方法更新了上面的代码示例。根据我的基准测试工作,最快的是 ToDictionary,其次是 Func,然后是 Where 方法。

原始查询

var query = from record in xml.Elements("record")
let properties = record.Elements("property")
select new Record
{
Index = record.Attribute("index").Value,
Username = properties.Where(p => p.Attribute("name").Value == "Username").Single().Value,
Domain = properties.Where(p => p.Attribute("name").Value == "Domain").Single().Value,
LastLogon = properties.Where(p => p.Attribute("name").Value == "LastLogon").Single().Value
};

使用 Func 查询

可以使用以下代码减少原始查询的冗余:

Func<XElement, string, string> GetAttribute =
(e, property) => e.Elements("property")
.Where(p => p.Attribute("name").Value == property)
.Single().Value;

var query = from record in xml.Elements("record")
select new Record
{
Index = record.Attribute("index").Value,
Username = GetAttribute(record, "Username"),
Domain = GetAttribute(record, "Domain"),
LastLogon = GetAttribute(record, "LastLogon")
};

关于c# - 我如何通过 linq 到 xml 从 xml 获取所有 "properties",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2323738/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com