使用XDocument从XML检索属性值

时间:2013-10-24 13:03:37

标签: c# xml

我正在使用XDocument.Parse方法加载以下XML:

<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. 的一个实例中
  4. 最后,在输入中提供的不同XML中可能缺少任何节点。因此,我需要以这样的方式编写代码:如果节点丢失,则应用程序不会抛出OBJECT REFERENCE NOT FOUND Exception

3 个答案:

答案 0 :(得分: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; }
}

你将拥有一个可以更轻松处理的对象

答案 1 :(得分: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);

答案 2 :(得分:0)

快速而肮脏的解决方案 - 希望你能从这里拿走它:

var participantID = String.Join(", ",
                                xdoc.Root.Elements("Participant")
                                         .Select(e => e.Attribute("ParticipantID"))
                                         .Where(a => a != null)
                                         .Select(a => a.Value)
                                         .Distinct());