2013-04-08 78 views
3

开始之前,我这是我的第一篇文章,所以如果有什么我做错了或者没有做,请告诉我,我来编辑自己的帖子如何最好地提取属性值,并与LINQ元素值和C#

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

<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可能会工作和

编辑2:谢谢你三个很好的答案,我没有req。信誉给予好评解答,我需要测试之前到我的dev的机器,但是这真的看起来什么即时寻找:)

+1

您是否尝试过使用xsd.exe为该XML生成c#类?它可以生成强类型的类,可以用来将XML反序列化为(不需要linq) – jle 2013-04-08 12:10:20

+0

解析XML文件有多种方式:使用DataSet,XmlSerializer,XPathDocument,XmlDocument,XDocument和XmlTextReader。 – 2013-04-08 12:14:52

回答

2

据我了解,你需要访问属性和值作为例子来解析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 
1
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 
     }; 
1

要获得每个元素的属性:

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

or in one si ngle查询: -

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