C#xml读取所有子节点

本文关键字:子节点 读取 C#xml | 更新日期: 2024-09-25 00:26:20

我对C#和XML解析完全陌生,所以我想问如何读取这个XML文件中的所有节点?

<root>
    <info>
        <name>
            <first>bob</first>
            <last>john</last>
            <middle>D</middle>
        </name>
        <age>35</age>
        <sex>male</sex>
        <id>12345</id>
    </info>
    <info>
        <name>
            <first>jack</first>
            <last>dawnson</last>
            <middle>D</middle>
        </name>
        <age>23</age>
        <sex>male</sex>
        <id>23456</id>
    </info>
</root>

我可以得到年龄、性别和身份证的值,但不能得到姓名或其子节点。到目前为止我得到的是什么?

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xmlOut);  
XmlNodeList node = doc.SelectNodes("/root/Info");  
Employee empOne = new Employee();  
foreach (XmlNode childNode in node)  
{
    empOne.Age = childNode["age"].InnerText;
    empOne.Sex = childNode["sex"].InnerText;
    empOne.ID = childNode["id"].InnerText;
    foreach (XmlNode node2 in childNode.ChildNodes)
    {
        empOne.FirstName = node2["first"].InnerText;
        empOne.LastName = node2["last"].InnerText;
    }  
}

C#xml读取所有子节点

我使用Linq-to-xml为您的xml制作了一个小示例应用程序。要解析XML,可以使用以下方法:

internal List<Employee> ReadEmployees()
{
    List<Employee> employees = new List<Employee>();
    string fileName = "XMLFile1.xml";
    if (File.Exists(fileName))
    {
        XDocument document = XDocument.Load(fileName);
        if (document.Root != null)
        {
            foreach (XElement infoElement in document.Root.Elements("info"))
            {
                Employee employee = new Employee();
                XElement ageElement = infoElement.Element("age");
                XElement sexElement = infoElement.Element("sex");
                XElement idElement = infoElement.Element("id");
                XElement nameElement = infoElement.Element("name");
                if (ageElement != null)
                    employee.Age = ageElement.Value;
                if (sexElement != null)
                    employee.Sex = sexElement.Value;
                if (idElement != null)
                    employee.Id = idElement.Value;
                if (nameElement != null)
                {
                    var firstnameElement = nameElement.Element("first");
                    var lastnameElement = nameElement.Element("last");
                    if (firstnameElement != null)
                        employee.Firstname = firstnameElement.Value;
                    if (lastnameElement != null)
                        employee.Lastname = lastnameElement.Value;
                }
                employees.Add(employee);
            }
        }
    }
    return employees;
}

我通过创建类并将其转换为xml来解决这个问题。。

 public class Root
 {
    public List<Info> infos{ get; set; }
    public Root()
    {
    }
    public Root(List<Info> infos)
    {
        this.infos = new List<Info>();
        this.infos = infos;
    }
  }

 public class Info
 {
    public Name name { get; set; }
    public int age { get; set; }
    public String sex { get; set; }
    public long id { get; set; }
 }

 public class Name 
{
    public String first { get; set; }
    public String last { get; set; }
    public String middle { get; set; }
}

  class XmlConvertor
{
    public String GetXmlFromObject<T>(T obj)
    {
        XmlSerializer serializer = new XmlSerializer(obj.GetType());
        XmlSerializerNamespaces nameSpace = new XmlSerializerNamespaces();
        nameSpace.Add("", "");
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.OmitXmlDeclaration = true;
        StringWriter sr = new StringWriter();
        XmlWriter xmlWriter = XmlWriter.Create(sr, settings);
        serializer.Serialize(xmlWriter, obj, nameSpace);
         return sr.ToString();
    }
    public T GetObjectFromXml<T>(String xmlString)
    {
        return (T)new XmlSerializer(typeof(T))
            .Deserialize(new StringReader(xmlString));
    }
}

在你的主类中,你可以使用这个方法。。

  Root root = new XmlConvertor().GetObjectFromXml<Root>("your xml in string");

然后你可以使用这个根变量,可以得到你想要的每个值。。我知道它有点长,但它更灵活,因为你不必硬编码节点的名称

好吧,我会用一些简单的LINQ2XML来查询它

var xdoc = XDocument.Load(xml);
var p = xdoc.Root.Elements("info").Select(x => new { first = x.Element("name").Element("first").Value,
    last = x.Element("name").Element("last").Value,
    middle = x.Element("name").Element("middle").Value,
    age = x.Element("age").Value, 
    sex = x.Element("sex").Value, id = x.Element("id").Value});

不过,如果需要传递它,则必须为它构建一个新对象。