【问题标题】:parse Linq To Xml with attribute nodes使用属性节点解析 Linq To Xml
【发布时间】:2010-03-29 14:01:54
【问题描述】:

我有以下结构的 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#)来实现这一点?

【问题讨论】:

  • 添加了常规的 c# 标签以获得更好的可见性和更多的响应。

标签: c# xml linq c#-3.0 linq-to-xml


【解决方案1】:

这是一种将数据结构解析为包含 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);
}

【讨论】:

    【解决方案2】:

    你可以这样做:

    XDocument doc = XDocument.Parse(YourXML);    
    var nodes = doc.Descendants("node").Where(x => x.Attribute("alias").Value == "element1");
    

    这将找到别名属性为element1的所有节点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多