лучший способ прочитать XML - PullRequest
2 голосов
/ 08 июля 2011

У меня есть XML-файл

<root>
  <child_1>
    <sub_child attr1="text" attr2="text" />
    <sub_child attr1="text" attr2="text" />
    <sub_child attr1="text" attr2="text" />
  </child_1>    
  <child_2>
    <sub_child attr1="text" attr2="text" />
    <sub_child attr1="text" attr2="text" />
    <sub_child attr1="text" attr2="text" />
  </child_2>    
  <child_3>
    <sub_child_1 attr1="text" attr2="text" />
    <sub_child_2 attr1="text" attr2="text" />
  </child_3>    
  ...

, и я хочу прочитать атрибуты sub_child для классов

class SubChild {
  string a1;
  string a2;
}

Мне нужны два списка объектов SubChild для child_1 и child_2 и два объекта SubChild дляsub_child_1 и sub_child_2

Теперь я использую linq для xml, и мой код

// List<SubChild> 
var child_1 = from s in doc.Descendants("sub_child").Where(x => x.Parent.Name == "child_1")
              select new SubChild {
                a1 = s.Attribute("attr1").Value,
                a2 = s.Attribute("attr2").Value,
              };

// List<SubChild> 
var child_2 = from s in doc.Descendants("sub_child").Where(x => x.Parent.Name == "child_2")
              select new SubChild {
                a1 = s.Attribute("attr1").Value,
                a2 = s.Attribute("attr2").Value,
              };

// SubChild
var sub_1 = (from s in doc.Descendants("sub_child_1")
              select new SubChild {
                a1 = s.Attribute("attr1").Value,
                a2 = s.Attribute("attr2").Value,
              }).First();

// SubChild
var sub_2 = (from s in doc.Descendants("sub_child_2")
              select new SubChild {
                a1 = s.Attribute("attr1").Value,
                a2 = s.Attribute("attr2").Value,
              }).First();

, но выглядит уродливо, и я хотел бы спросить, есть ли более ясный способ сделать это?

Ответы [ 3 ]

2 голосов
/ 08 июля 2011

Вы можете указать «Путь», используя .Element() и .Elements(), исключая where лямбда-выражения.

 // untested
 var child_1 = from s in doc.Root.Element("child_1").Elements("sub_child")
          select new SubChild {
            a1 = s.Attribute("attr1").Value,
            a2 = s.Attribute("attr2").Value,
          };
1 голос
/ 08 июля 2011

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

Dictionary<string, List<SubChild>> dict = doc.Root.Elements().ToDictionary(
    e => e.Name.ToString(),
    e => e.Elements("sub_child")
          .Select(s => new SubChild
                       {
                           a1 = s.Attribute("attr1").Value,
                           a2 = s.Attribute("attr2").Value,
                       }).ToList());
dict["child_1"][0] // get the first subchild of "child_1"
0 голосов
/ 08 июля 2011

Вам действительно нужно использовать linq to xml?

public IEnumerable<SubChild> GetSubChilds(XmlDocument xd)
{
   foreach (XmlNode subChild in xd.SelectNodes("/root/*/*"))
   {
       if (subChild.Name.StartsWith("sub_child"))
       {
           XmlAttributeCollection atts = subChild.Attributes;
           yield return new SubChild { a1 = atts["attr1"].Value, a2 = atts["attr2"].Value };
       }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...