我正在使用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
来读取单个属性。我无法理解如何在不同节点上迭代相同的东西,前提是某些节点可能会丢失。
请注意:
<Network>
和<Participant>
个节点正在重复。ParticipantName
属性仅存在于答案 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());