如何动态获取同名id的xml文件的最后一个元素

How to dynamically get the last element of a xml file with the same name id

Xml 包含系列列表的文件。可以随时将家庭添加到列表中,也可以添加新的 child..

<family>
 <Mother>
      <child age="1">
       <dog-name>dog1</dog-name>
      </child>
      <child age="2">
       <dog-name>dog1</dog-name>
      </child>
      <child age="3">
       <dog-name>dog1</dog-name>
      </child>
      <child age="4">
        <dog-name>dog1</dog-name>
      </child>
   </Mother>
</family>
<family2>
   <Mother>
      <child age="1">
       <dog-name>dog1</dog-name>
      </child>
      <child age="2">
       <dog-name>dog1</dog-name>
      </child>
      <child age="3">
       <dog-name>dog1</dog-name>
      </child>
      <child age="4">
        <dog-name>dog1</dog-name>
      </child>
   </Mother>
</family2>
<family3>
   <Mother>
      <child age="1">
       <dog-name>dog1</dog-name>
      </child>
      <child age="2">
       <dog-name>dog1</dog-name>
      </child>
      <child age="3">
       <dog-name>dog1</dog-name>
      </child>
      <child age="4">
        <dog-name>dog1</dog-name>
      </child>
   </Mother>
</family3>

我正在尝试读取任何家庭中最年长的 child 的年龄,但最多可以将一个新的 child 添加到 xml。

我试过:

while (xOtherReader.Read())
        {
            if (xOtherReader.NodeType == XmlNodeType.Element &&    xOtherReader.Name == "family2")
            {
                xOtherReader.ReadToFollowing("Mother");

                if (xOtherReader.NodeType == XmlNodeType.Element && xOtherReader.Name == "Mother")
                {
                    xOtherReader.ReadToFollowing("child");
                    if (xOtherReader.NodeType == XmlNodeType.Element && xOtherReader.Name == "child")
                    {
                        xOtherReader.ReadEndElement();
                        Console.Write(xOtherReader.GetAttribute("age");
                    }
                }
            }
        }

我还想获取最老的狗的名字 child 并输出值..

使用XML Linq

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml =
                "<Root>" +
                "<family>" +
                     "<Mother>" +
                          "<child age=\"1\">" +
                           "<dog-name>dog1</dog-name>" +
                          "</child>" +
                          "<child age=\"2\">" +
                           "<dog-name>dog1</dog-name>" +
                          "</child>" +
                          "<child age=\"3\">" +
                           "<dog-name>dog1</dog-name>" +
                          "</child>" +
                          "<child age=\"4\">" +
                            "<dog-name>dog1</dog-name>" +
                          "</child>" +
                       "</Mother>" +
                    "</family>" +
                    "<family2>" +
                       "<Mother>" +
                          "<child age=\"1\">" +
                           "<dog-name>dog1</dog-name>" +
                          "</child>" +
                          "<child age=\"2\">" +
                           "<dog-name>dog1</dog-name>" +
                          "</child>" +
                          "<child age=\"3\">" +
                           "<dog-name>dog1</dog-name>" +
                          "</child>" +
                          "<child age=\"4\">" +
                            "<dog-name>dog1</dog-name>" +
                          "</child>" +
                       "</Mother>" +
                    "</family2>" +
                    "<family3>" +
                       "<Mother>" +
                          "<child age=\"1\">" +
                           "<dog-name>dog1</dog-name>" +
                          "</child>" +
                          "<child age=\"2\">" +
                           "<dog-name>dog1</dog-name>" +
                          "</child>" +
                          "<child age=\"3\">" +
                           "<dog-name>dog1</dog-name>" +
                          "</child>" +
                          "<child age=\"4\">" +
                            "<dog-name>dog1</dog-name>" +
                          "</child>" +
                       "</Mother>" +
                    "</family3>" +
                 "</Root>"; ;

            XElement family = XElement.Parse(xml);

            var results = family.Elements().Select(x => new
            {
                name = x.Name,
                children = x.Descendants("child").Select(y => new
                {
                    age = (int)y.Attribute("age"),
                    dog_name = y.Element("dog-name").Value
                }).OrderByDescending(z => z.age).ToList()
            }).ToList();

            foreach (var family_properties in results)
            {
                Console.WriteLine("Family Name : {0}, Age = {1}, Dog Name = {2}",
                    family_properties.name, family_properties.children.FirstOrDefault().age, family_properties.children.FirstOrDefault().dog_name); 
            }
            Console.ReadLine();
        }
    }
}
​