例外:XPath表达式计算为意外类型System.Xml.Linq.XAttribute

时间:2016-09-07 02:30:32

标签: c# xml xpath linq-to-xml

我有一个如下所示的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有什么问题吗?

3 个答案:

答案 0 :(得分:9)

您的XPath很好(虽然您可能希望它更具选择性),但您必须调整评估方式......

XPathSelectElement(),顾名思义,只应用于选择元素。

XPathEvaluate()更通用,可用于属性。您可以枚举结果,或抓住第一个:

var type = ((IEnumerable<object>)doc.XPathEvaluate("//Employee/Address/@Type"))
                                    .OfType<XAttribute>()
                                    .Single()
                                    .Value;

答案 1 :(得分:2)

另一种选择是:

var addresses = doc.XPathSelectElements("//Employee/Address"));
foreach(var address in addresses) {
    var addrType = address.Attribute("Type").Value;
}

答案 2 :(得分:1)

扩展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();
    }
}
相关问题