2013-10-24 2 views
-3

Я использую XDocument.Parse метод для загрузки следующего XML:Получить значение атрибутов из XML с помощью XDocument

<AuditMessage> 

    <Event Action="Read" DateTime="2013/26/7" EventID="100"/> 
    <User Role="Admin" UserID="12123"/User> 
    <SourceIdentification SourceID="TeamLondon" SourceType="3"/> 
    <Network AccessPointID="143.176.8.32" AccessPointTypeCode="1" /> 
    <Network AccessPointID="143.176.8.32" AccessPointTypeCode="`2" /> 
    <Participant ParticipantID="0001" ParticipantType ="2"/> 
    <Participant ParticipantID="0002" ParticipantType ="3"/> 
    <Participant ParticipantID="0003" ParticipantType ="3" ParticipantName = "Housh Mangrove"/> 

</AuditMessage> 

Мне нужно получить значение следующих атрибутов в приведенном выше XML.

-DateTime  
-Role  
-AccessPointID  
-ParticipantID  
-ParticipantName 

Я использовал sourceXML.Root.Element(nodeName).Attribute(attributeToMatch).Value для чтения одного атрибута. Я не понимаю, как я могу повторять одно и то же на разных узлах, если некоторые узлы могут отсутствовать. Обратите внимание:

  1. <Network> и <Participant> узлы повторяют.
  2. ParticipantName Атрибут существует только в одном экземпляре
  3. Наконец, любой узел может отсутствовать в разных XML-файлах, предоставляемых как Input. Поэтому мне нужно написать код таким образом, что если узел отсутствует, приложение не бросает OBJECT REFERENCE NOT FOUND. Исключение
+3

это довольно просто сделать, не так сделать попытку? – Jonesopolis

+0

Да, я сделал, я могу прочитать один атрибут, используя sourceXML.Root.Element (nodeName) .Attribute (attributeToMatch) .Value; Мне было интересно, есть ли более простой метод, так как это приведет к повторяющемуся коду –

+0

. Проверьте [это] (https://www.google.com/search?q=xDocument+node+c%23) –

ответ

0

вот кратковременная попытка, вы можете выяснить, какие из них я не добавил в:

public static void Main() 
{ 
    GetAtts(xml); 
} 

public static Atts GetAtts(string xml) 
{ 
    Atts atts = new Atts(); 
    XDocument doc = XDocument.Parse(xml); 

    if (doc.Root.Element("Event") != null) 
     atts.datetime = doc.Root.Element("Event").Attribute("DateTime").Value; 

    //... 

    foreach (XElement ele in doc.Descendants("Network")) 
     atts.accesspointid.Add(ele.Attribute("AccessPointID").Value); 


    return atts; 
} 

public class Atts 
{ 
    public string datetime { get; set; } 
    public string role { get; set; } 

    private List<string>_accesspointid = new List<string>(); 
    public List<string> accesspointid { get { return _accesspointid; } set { _accesspointid = value; } } 

    public List<string> _participantid = new List<string>(); 
    public List<string> participantid { get { return _participantid; } set { _participantid = value; } } 

    public string participantname { get; set; } 
} 

вы будете иметь объект, который может обрабатывать более легко

0

вы можете использовать метод Elements, чтобы получить перечисление узлов данного имени.

Затем вы можете проверить, вернули ли перечисления какие-либо результаты и найдите в них соответствующие атрибуты.

Что-то вроде этого, если вы хотите его как CSV:

var data = new List<string>(); 

var events = doc.Root.Elements("Event"); 

if (events.Any()) 
{ 
    foreach (var evt in events) 
    { 
     data.Add(evt.Attribute("DateTime").Value); 
    } 
} 

var participants = doc.Root.Elements("Participant"); 

if (participants.Any()) 
{ 
    foreach (var participant in participants) 
    { 
     data.Add(participant.Attribute("ParticipantID").Value); 
    } 
} 

var csv = string.Join(", ", data); 
0

Быстрый и грязный раствор - надеюсь, вы можете взять его отсюда:

var participantID = String.Join(", ", 
           xdoc.Root.Elements("Participant") 
             .Select(e => e.Attribute("ParticipantID")) 
             .Where(a => a != null) 
             .Select(a => a.Value) 
             .Distinct()); 
Смежные вопросы