У меня есть XML-файл, как показано ниже:

<Employees>
  <Employee Id="ABC001">
    <Name>Prasad 1</Name>
    <Mobile>9986730630</Mobile>
    <Address Type="Perminant">
      <City>City1</City>
      <Country>India</Country>
    </Address>
    <Address Type="Temporary">
      <City>City2</City>
      <Country>India</Country>
    </Address>
  </Employee>

Теперь я хочу получить все типы адресов.

Я пробовал использовать XPath, как показано ниже, и получаю исключение.

var xPathString = @"//Employee/Address/@Type";
doc.XPathSelectElements(xPathString); // doc is XDocument.Load("xml file Path")

Исключение: выражение XPath получило неожиданный тип System.Xml.Linq.XAttribute.

Есть ли проблема с моим XPath?

13
Prasad Kanaparthi 7 Сен 2016 в 05:30

3 ответа

Лучший ответ

Ваш XPath в порядке (хотя вы можете захотеть, чтобы он был более избирательным), но вам нужно настроить то, как вы его оцениваете ...

XPathSelectElement(), как следует из названия, следует использовать только для выбора элементов.

XPathEvaluate() является более общим и может использоваться для атрибутов. Вы можете перечислить результаты или взять первый:

var type = ((IEnumerable<object>)doc.XPathEvaluate("//Employee/Address/@Type"))
                                    .OfType<XAttribute>()
                                    .Single()
                                    .Value;
13
kjhughes 7 Сен 2016 в 03:33

Расширяя ответ kjhughes, я стремился создать для этого расширение класса XElement, чтобы я мог просто вызвать element.XPathSelectAttribute (), что делает мой вызывающий код более понятным.

public static class XElementExtensions
{
    public static XAttribute XPathSelectAttribute(this XElement element, string xPath)
    {
        return ((IEnumerable<object>)element.XPathEvaluate(xPath)).OfType<XAttribute>().First();
    }
}
1
Benj 13 Июн 2020 в 21:15

Другой вариант:

var addresses = doc.XPathSelectElements("//Employee/Address"));
foreach(var address in addresses) {
    var addrType = address.Attribute("Type").Value;
}
2
knocte 29 Июл 2020 в 09:26