我有一个像这样的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,
};
但它只返回第一个节点
答案 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;