0

基本上我有xml文件格式,喜欢:

<?xml version="1.0" encoding="utf-8" ?>
<retentions>
   <client id="1544">
      <facility id="5436">
         <retention period="23" />
      </facility>
   </client>
   <client id="7353">
      <facility id="3450">
        <retention period="3" />
     </facility>
   </client>
</retentions>

我想获取所有属性的所有值,例如“1554”、“5436”、“23”等。

请使用 XDocument 而不是 XMLDocument。我的代码是错误的:

XDocument XDoc = XDocument.Load("my.xml");
   IEnumerable<XElement> results = (from el in XDoc.Root.Elements("retentions")
                                         select el);

更新:(使用字典)

var g = from element in XDoc.Descendants("client")
                from ID in element.Attributes("id")
                from Facility in element.Attributes("facility")
                from Period in element.Attributes("period")
                select new { Key = ID.Value, Value = Period.Value };
4

2 回答 2

4

从 xml 文档中获取所有属性的一行:

var attributes = ((IEnumerable)xdoc.XPathEvaluate("//@*"))
                      .Cast<XAttribute>().Select(a => (string)a);

UPDATE(所有节点属性的字典)

var attributes = xdoc.Descendants()
                    .GroupBy(e => e.Name)
                    .ToDictionary(g => g.Key.LocalName,
                                  g => g.SelectMany(x => x.Attributes())
                                        .Select(a => (string)a)
                                        .ToList());

List<string> attributesOfClient = attributes["client"];
于 2013-01-21T21:20:55.830 回答
2

要获取元素的属性:

XElement xElement;
IEnumerable attributes = xElement.Attributes();

获取文档的所有元素:

XDocument xDocument;
IEnumerable<XElement> elements = xDocument.Descendants();

然后,使用 LINQ:所有值都是:

from element in xDocument.Descendants()
from attribute in element.Attributes()
select attribute.Value;

这是你想要的吗?

更新

var dictionary = xDocument.Descendants("client").ToDictionary(element => element, element =>
    (from descendant in element.Descendants()  // Gets descendant elements of element
    from attribute in descendant.Attributes()  // Gets all the attributes of the descendant
    select attribute.Value).ToList());

更新 2

var g = XDoc.Descendants("client")
        .ToDictionary(element => element.Attribute("id").Value,
                      element => new 
                                 {                                 
                                     element.Descendants("facility").First().Attribute("id").Value, 
                                     element.Descendants("retention").First().Attribute("period").Value 
                                  });
于 2013-01-21T21:11:18.067 回答