У меня есть следующий XML, показанный на следующем изображении:
Но я не могу на всю жизнь меня получить код, чтобы выбрать элемент дома между <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, показанные выше, но я не могу добраться до отдельных домов.
Вы можете выбрать узлы 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.
<house_id>
каждый дом, чтобы получить <house_id>
или <location>
С 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"));
}