XML Как выбрать дочерние элементы с помощью XPath

2

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

Изображение 174551

Но я не могу на всю жизнь меня получить код, чтобы выбрать элемент дома между <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
    Почему вы не используете сериализацию XML? Поскольку этот XML, очевидно, был сгенерирован с помощью XML-сериализации, это, вероятно, наиболее естественное решение ...
  • 0
    Взгляните на использование XPath Visualizer для тестирования ваших запросов XPath на XML.
Теги:
xpath
nodes

2 ответа

1
Лучший ответ

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

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.

Кроме того, обязательно подумайте о том, что Thomas Levesque предложил использовать сериализацию XML.

  • 0
    Спасибо за подсказку, как бы я затем <house_id> каждый дом, чтобы получить <house_id> или <location>
  • 0
    @ Култон: Пожалуйста, смотрите обновление.
0

С 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"));
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню