如何用LINQ和c#最好地提取属性值和元素值

本文关键字:提取 属性 元素 何用 LINQ | 更新日期: 2023-09-27 18:08:15

在我开始之前,这是我的第一篇文章,所以如果有什么我做错了或没有做的请告诉我,我会编辑我的文章

我有一个格式如下的文档。

<Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'>
    <EventData>
        <Data Name='SubjectUserSid'>S-1-0-0</Data>
        <Data Name='SubjectUserName'>MACHINE$</Data>
        <Data Name='SubjectDomainName'>DOMAIN</Data>
        <Data Name='SubjectLogonId'>0x0</Data>
        <Data Name='TargetUserSid'>S-1-0-0</Data>
        <Data Name='TargetUserName'>username</Data>
        <Data Name='TargetDomainName'>TDname</Data>
        <Data Name='Status'>0x0</Data>
        <Data Name='FailureReason'>%%2313</Data>
        <Data Name='SubStatus'>0x0</Data>
        <Data Name='LogonType'>10</Data>
    </EventData>
</Event>

我遇到了一个小问题,它可以从XML中提取值(属性值和相应的元素值)。我需要一个语句的每个属性,或者我可以返回一个列表,只是循环的值?

编辑:值需要被提取,所以我可以把它们发送到数据库。我想尝试使用LINQ,但是Xpath也可以。

谢谢你的三个好答案,我没有要求。我需要在测试之前到达我的开发机器,但这真的看起来是我在寻找的:)

如何用LINQ和c#最好地提取属性值和元素值

据我所知,您需要访问属性和值作为解析xml的示例。

我是否需要一个语句为每个属性或我可以返回一个列表然后循环遍历这些值?

不,你不需要。使用下面的代码作为示例来解析xml:

//str contains your xml
XDocument xml = XDocument.Parse(str);
XNamespace ns = "http://schemas.microsoft.com/win/2004/08/events/event";
foreach (var node in xml.Descendants(ns + "Data"))
{
    Console.WriteLine ("Name: " + (string)node.Attribute("Name") + "; "+
                       "Value: " + node.Value);
}

将打印:

Name: SubjectUserSid; Value: S-1-0-0
Name: SubjectUserName; Value: MACHINE$
Name: SubjectDomainName; Value: DOMAIN
Name: SubjectLogonId; Value: 0x0
Name: TargetUserSid; Value: S-1-0-0
Name: TargetUserName; Value: username
Name: TargetDomainName; Value: TDname
Name: Status; Value: 0x0
Name: FailureReason; Value: %%2313
Name: SubStatus; Value: 0x0
Name: LogonType; Value: 10

XNamespace ns = "http://schemas.microsoft.com/win/2004/08/events/event";
var document = XDocument.Parse(
    "<Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'>" +
    "<EventData>" +
    "    <Data Name='SubjectUserSid'>S-1-0-0</Data>" +
    "    <Data Name='SubjectUserName'>MACHINE$</Data>" +
    "    <Data Name='SubjectDomainName'>DOMAIN</Data>" +
    "    <Data Name='SubjectLogonId'>0x0</Data>" +
    "    <Data Name='TargetUserSid'>S-1-0-0</Data>" +
    "    <Data Name='TargetUserName'>username</Data>" +
    "    <Data Name='TargetDomainName'>TDname</Data>" +
    "    <Data Name='Status'>0x0</Data>" +
    "    <Data Name='FailureReason'>%%2313</Data>" +
    "    <Data Name='SubStatus'>0x0</Data>" +
    "    <Data Name='LogonType'>10</Data>" +
    "</EventData>" +
    "</Event>");
var q = from element in document.Root.Element(ns + "EventData").Elements(ns + "Data")
        select new
        {
            Name = element.Attribute("Name").Value,
            Value = element.Value
        };

获取每个元素的属性:

var attributes = from n in xml.Descendants("Data")
                        select n.Attributes("Name").Select(s => s.Value);

获取每个元素的数据:

var data = from n in xml.Descendants("EventData")
                        select n.Elements("Data").Select(s => s.Value);

或在单个查询中:-

var nodes = from n in xml.Descendants("EventData").Elements("Data")
                        select new
                        {
                            Data = n.Value,
                            Attribute = n.Attribute("Name").Value
                        };