2013-04-08 14 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. Мне нужна инструкция для каждого из атрибутов или я могу вернуть список и просто перебрать значения?

EDIT: значения должны быть извлечены, поэтому я могу отправить их в базу данных. Я хотел бы попробовать использовать LINQ для этого, но Xpath может работать так же

EDIT2: Спасибо за три хороших ответа, у меня нет требования. репутации в upvote ответов, и мне нужно, чтобы добраться до моего Dev машины перед испытанием, но это действительно выглядит то, что им ищет :)

+1

Вы пытались использовать xsd.exe для генерации классов C# для этого XML? Он может генерировать строго типизированные классы, которые можно использовать для десериализации XML в (linq не обязательно). – jle

+0

Существуют различные способы анализа XML-файлов: использование DataSet, XmlSerializer, XPathDocument, XmlDocument, XDocument и XmlTextReader. –

ответ

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

Или в одном си ngle query: -

var nodes = from n in xml.Descendants("EventData").Elements("Data") 
         select new 
         { 
          Data = n.Value, 
          Attribute = n.Attribute("Name").Value 
         }; 
Смежные вопросы