2013-04-08 16 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 
         };