如何从XML文件中按编号获取子节点

时间:2013-10-13 18:21:00

标签: c# xml winforms xmlnode

我试图通过属性“times”对我的XML中的数据进行排序,并在TreeView中显示它

我有像

这样的XML文件
<main>
  <data url="http://www.r.com/" data="13.10.2013 20:16:33" times="6" />
  <data url="https://www.google.com/" data="13.10.2013 20:16:14" times="5" />
  <data url="http://ya.com/" data="13.10.2013 19:21:15" times="26" />
</main>

我想要的是按属性“次”对所有节点进行排序。如果我可以获得任何节点(1,2或3),我可以获取属性并将其与第一个ono进行比较 - 因此可以进行一些排序。但我不能得到必需的元素。

所以问题 - 我如何从XML文件中获取任何节点,如果我只知道它的序列号或我如何按某种属性对XML文件进行排序?

发现,如果我有身份证明 - 我可以使用像

这样的东西
XmlDocument myXml = new XmlDocument();
myXml.Load(myfile);
myXml.GetElementById(`here put id`).GetAttribute("required attribute")

但我没有任何身份证明。

修改

<main>
  <data url="http://ya.com/" data="13.10.2013 19:21:15" times="**26**" />
  <data url="http://www.r.com/" data="13.10.2013 20:16:33" times="**6**" />
  <data url="https://www.google.com/" data="13.10.2013 20:16:14" times="**5**" />
</main>

2 个答案:

答案 0 :(得分:1)

Linq-> Xml的新手,所以我不知道效率,但似乎有效。

XDocument xdoc = XDocument.Parse(xml);
var ordered = xdoc.Descendants("data")
                  .OrderByDescending(x => int.Parse(x.Attribute("times").Value))
                  .ToArray();
xdoc.Root.RemoveAll();
xdoc.Root.Add(ordered);

答案 1 :(得分:1)

由于您希望在TreeView中显示数据,您需要先从xml获取所有数据,然后按times

对其进行排序
XDocument doc=XDocument.Load(url);
//extract all data from xml
var data=doc.Descendants("data")
            .Select(x=>
               new
               {
                   url=x.Attribute("url").Value,
                   data=x.Attribute("data").Value,
                   times=int.Parse(x.Attribute("times").Value)
               } 
);

foreach(var datum in data.OrderByDescending(x=>x.times))
{
    datum.url;
    datum.data;
    datum.times;
}