XML Как выбрать дочерние элементы с помощью XPath - PullRequest
2 голосов
/ 03 февраля 2012

У меня есть следующий XML, показанный на следующем рисунке:

XML File

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

Будет больше, чем один House элемент, когда мне удастся заставить его выбрать один, вот мой код:

// Parse the data as an XML document
XDocument xmlHouseResults = XDocument.Parse(houseSearchResult);

// Select the House elements
XPathNavigator houseNavigator = xmlHouseResults.CreateNavigator();

XPathNodeIterator nodeIter = houseNavigator.Select("/ArrayOfHouse/House");

// Loop through the selected nodes
while (nodeIter.MoveNext())
{

    // Show the House id, as taken from the XML document
    MessageBox.Show(nodeIter.Current.SelectSingleNode("house_id").ToString());
}

Я получаю поток XML, потому что мне удалось показать данные в MessageBox, показанном выше, но я не могу добраться до отдельных домов.

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

Вы можете выбрать узлы Дома следующим образом:

var houses = XDocument.Parse(houseSearchResult).Descendants("House");
foreach(var house in houses)
{
    var id = house.Element("house_id");
    var location = house.Element("location");
}

Или вы можете использовать Select для прямого получения строго типизированного объекта:

var houses = XDocument.Parse(houseSearchResult)
                      .Descendants("House")
                      .Select(x => new House
                                   {
                                       Id = x.Element("house_id"),
                                       Location = x.Element("location")
                                   });

Предполагается, что существует класс House со свойствами Id и Location.

Также, пожалуйста, подумайте о предложении Томаса Левеска использовать сериализацию XML.

0 голосов
/ 03 февраля 2012

В XPath вам нужно будет использовать XmlNamespaceManager, однако, поскольку у вас есть XDocument, вы можете просто использовать методы оси LINQ to XML, например

XNamespace df = XmlHouseResults.Root.Name.Namespace;

foreach (XElement house in XmlHouseResults.Descendants("df" + "House"))
{
  MessageBox.Show((string)house.Element("df" + "house_id"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...