Мой XML выглядит так

<Location>
    <AChau>
        <ACity>
          <EHouse/>
          <FHouse/>
          <GHouse/>
        </ACity>

        <BCity>
          <HHouse/>
          <IHouse/>
          <JHouse/>
          <KHouse/>
        </BCity>
    </AChau>
</Location>

Я нахожу несколько способов, я здесь, чтобы найти наиболее близкий ответ

Получить все имя узла в xml в silverlight

Но читает все потомки, мне нужно именно из "Location" получить "AChau"

Из "Location / AChau" получить "ACity" "BCity"

Из "Location / AChau / A City" получить "House" "GHouse" "GHouse"

Как я могу читать только дочерний узел?

0
AM031447 25 Дек 2015 в 11:32

4 ответа

Лучший ответ

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

string[] names = xElem.Elements().Select(e => e.Name.LocalName).ToArray();

Например, этот код с вашим XML:

public static MyXExtensions 
{
    public static string[] ChildrenNames(this XElement xElem)
    {
        return xElem.Elements().Select(e => e.Name.LocalName).ToArray();
    }
}

string[] names1 = xDoc.Root.ChildrenNames();
string[] names2 = xDoc.Root.Element("AChau").ChildrenNames();
string[] names3 = xDoc.XPathSelectElement("Location/AChau/ACity").ChildrenNames();

Вернет следующие массивы соответственно:

["AChau"]
["ACity", "BCity"]
["EHouse", "FHouse", "GHouse"]
1
Yeldar Kurmangaliyev 25 Дек 2015 в 09:21

Попробуйте этот 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 = 
                "<Location>" +
                    "<AChau>" +
                        "<ACity>" +
                          "<EHouse/>" +
                          "<FHouse/>" +
                          "<GHouse/>" +
                        "</ACity>" +
                        "<BCity>" +
                          "<HHouse/>" +
                          "<IHouse/>" +
                          "<JHouse/>" +
                          "<KHouse/>" +
                        "</BCity>" +
                    "</AChau>" +
                "</Location>";

            XElement location = XElement.Parse(xml);

            var results = location.Descendants("AChau").Elements().Select(x => new
            {
                city = x.Name.LocalName,
                houses = string.Join(",",x.Elements().Select(y => y.Name.LocalName).ToArray())
            }).ToList();
        }
    }
}
​
1
jdweng 25 Дек 2015 в 11:50

Это работает, если вы всегда хотите, чтобы имя первого узла находилось под корнем:

string xml = @"<Location>
              <AChau>
                <ACity>
                  <EHouse/>
                  <FHouse/>
                  <GHouse/>
                </ACity>

                <BCity>
                  <HHouse/>
                  <IHouse/>
                  <JHouse/>
                  <KHouse/>
                </BCity>
              </AChau>
            </Location>";

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
XmlNode root = doc.DocumentElement;
XmlNode first = root.FirstChild;
1
Westerlund.io 25 Дек 2015 в 08:43

Если вы используете XElement для получения данных из xml, тогда все, что вам нужно, это FirstNode и свойство Elements.

FirstNode возвращает первый дочерний узел элемента, а Elements возвращает все прямые дочерние узлы элемента.

1
Andy Korneyev 25 Дек 2015 в 08:39