我的xml具有以下结构
<ruleDefinition appId="3" customerId = "acf">
<node alias="element1" id="1" name="department">
<node alias="element2" id="101" name="mike" />
<node alias="element2" id="102" name="ricky" />
<node alias="element2" id="103" name="jim" />
</node>
</ruleDefinition>
此处节点使用别名而不是节点标记进行区分。如您所见,顶级节点element1具有与element2相同的节点名称“node”。我想根据属性别名解析这个XML。
Linq-To-Xml代码应该是什么(使用C#)来实现这个目标?
答案 0 :(得分:2)
这是一种将数据结构解析为包含Element1字符串属性和IEnumerable Element2属性的项的方法,该属性包含多个element2数据。
string xml = @"<ruleDefinition appId=""3"" customerId = ""acf"">
<node alias=""element1"" id=""1"" name=""department"">
<node alias=""element2"" id=""101"" name=""mike"" />
<node alias=""element2"" id=""102"" name=""ricky"" />
<node alias=""element2"" id=""103"" name=""jim"" />
</node>
</ruleDefinition>";
XDocument document = XDocument.Parse(xml);
var query = from node in document.Descendants("node")
where node.Attribute("alias").Value == "element1"
select new
{
Element1 = new
{
Id = node.Attribute("id").Value,
Name = node.Attribute("name").Value
},
Element2 = from n in node.Descendants("node")
where n.Attribute("alias").Value == "element2"
select new
{
Id = n.Attribute("id").Value,
Name = n.Attribute("name").Value
}
};
foreach (var item in query)
{
Console.WriteLine("{0}\t{1}", item.Element1.Id, item.Element1.Name);
foreach (var element2 in item.Element2)
Console.WriteLine("\t{0}\t{1}", element2.Id, element2.Name);
}
答案 1 :(得分:1)
你可以这样做:
XDocument doc = XDocument.Parse(YourXML);
var nodes = doc.Descendants("node").Where(x => x.Attribute("alias").Value == "element1");
将找到别名属性为element1的所有节点。