2013-10-24 52 views
-3

從XML屬性的值我使用XDocument.Parse方法來加載下面的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. 最後,作爲Input提供的不同XML中可能缺少任何節點。因此,我需要以這樣的方式編寫代碼,如果節點丟失,應用程序不會拋出OBJECT REFERENCE NOT FOUND異常
+3

這是非常簡單的事情,你有沒有做一次嘗試? – Jonesopolis

+0

是的,我可以通過使用sourceXML.Root.Element(nodeName).Attribute(attributeToMatch).Value來讀取單個屬性; 我想知道是否有一個更簡單的方法,因爲這將導致重複代碼 –

+0

檢查[this](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());