2015-03-03 3 views
-1

Я совершенно не знаком с синтаксисом C# и XML, поэтому мне нравится спрашивать, как я могу прочитать все узлы в этом XML-файле?C# xml read all childnodes

<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> 

я мог бы получить значение для возраста, пола, и ид, но не имя или его childnodes.Here то, что я до сих пор?

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; 
    } 
} 
+2

Во-первых, я настоятельно рекомендую использовать LINQ to XML - это сделает все намного проще. –

+0

Я думаю, что вам нужен рекурсивный поиск - //? – Tim

+0

Не должно быть 'foreach (XmlNode node2 в childNode [" name "]. ChildNodes)'? – Dialecticus

ответ

0

Я сделал небольшой пример приложения с вашим xml, используя Linq для 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; 
} 
0

я решить эту проблему, сделав класс, а затем преобразовать его в 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"); 

, то вы можете использовать этот переменный корень и может получить любое значение вы хотите .. я знаю, что это немного длительное, но она является более гибкой, потому что вы не должны жестким трески е имя узлов

0

Ну, я бы использовал несколько простых 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}); 

вы должны построить новый объект для него, если вам нужно передать его хотя.