使用Xdocument循环遍历xmlnodes

时间:2014-03-04 13:44:47

标签: c# linq linq-to-xml

我有一个像这样的xml字符串

<Test>
  <ConnectionParameters>
   <ConnectionParameter DisplayName="asd" Id="cgfh" IsPassword="false" IsRequired="true">   </ConnectionParameter>
   <ConnectionParameter DisplayName="asdasd" Id="fgh" IsPassword="false" IsRequired="true"></ConnectionParameter>
    <ConnectionParameter DisplayName="asdasd" Id="hdfh" IsPassword="false" IsRequired="true"></ConnectionParameter>
   <ConnectionParameter DisplayName="asdad" Id="dfgdf" IsPassword="false" IsRequired="true">  </ConnectionParameter>
 </ConnectionParameters>
</Test>

如何使用xdocument遍历每个“ConnectionParameter”标记以获取Id,DisplayName等属性?

我试过这样,

 XDocument xdoc = new XDocument();
    xdoc= XDocument.Parse(fileContent);
    var saveResult = from b in xdoc.Descendants("ConnectionParameters")
                     select new
                     {
                         success = (string)b.Element("ConnectionParameter").Attribute("Id").Value ?? string.Empty,
                     };

但它只返回第一个节点

2 个答案:

答案 0 :(得分:2)

您目前正在遍历所有ConnectionParameters元素(其中只有一个元素)并选择第一个ConnectionParameter元素(使用Element调用)。您想循环遍历ConnectionParameter元素:

// Note the lack of creating a new XDocument for no reason
XDocument xdoc = XDocument.Parse(fileContent);
var saveResult = from b in xdoc.Descendants("ConnectionParameter")
                 select new
                 {
                     success = (string) b.Attribute("Id") ?? ""
                 };

或者为了避免在没有明显原因的情况下创建匿名类型,并使用简单的“点符号”,因为查询表达式对您没有多大帮助:

XDocument xdoc = XDocument.Parse(fileContent);
var saveResult = xdoc.Descendants("ConnectionParameter")
                     .Select(b => (string) b.Attribute("Id") ?? "");

如果您希望将父元素名称显式化,可以使用:

XDocument xdoc = XDocument.Parse(fileContent);
var saveResult = xdoc.Element("Test")
                     .Element("ConnectionParameters")
                     .Descendants("ConnectionParameter")
                     .Select(b => (string) b.Attribute("Id") ?? "");

或者:

XDocument xdoc = XDocument.Parse(fileContent);
var saveResult = xdoc.Root
                     .Element("ConnectionParameters")
                     .Descendants("ConnectionParameter")
                     .Select(b => (string) b.Attribute("Id") ?? "");

答案 1 :(得分:1)

将xml加载到xDocument中,然后你可以做这样的事情(不记得确切的语法) xDoc.Root.Descendants("ConnectionParameters").Attribute("DisplayName").Value;