【问题标题】:Problem Reading XElement Attribute读取 XElement 属性时出现问题
【发布时间】:2010-01-16 16:23:44
【问题描述】:

任何人都知道为什么这个 xpath 表达式 "catzero/@id" 在这个 xml 上不起作用

document = XDocument.Load("file.xml");
var product = document.XPathSelectElements("//product", nameSpaceResolver).First();
var category = ((IEnumerable) product.XPathEvaluate("catzero/@id")).Cast<XAttribute>().first().value; //catezero/@id is null

【问题讨论】:

  • 请提供一些示例代码并解释发生了什么 - “不工作”不是很具有描述性。

标签: xpath linq-to-xml xattribute


【解决方案1】:

XPath 和 Linq-to-XML (XEelement) 通常不匹配 - Linq-to-XML 使用它自己的方法来遍历 XML 文档。

在您的情况下,您可以执行以下操作:

XDocument doc = XDocument.Load("http://www.quillarts.com/Test/Feed2.xml");

foreach(XElement xe in doc.Descendants("product"))
{
    if(xe.Element("catzero") != null)
    {
        var attr = xe.Element("catzero").Attribute("id");

        if(attr != null && attr.Value == "20")
        {
            string elementValue = xe.Value;
        }
    }
}

从您的问题中我不知道您想对这些元素和/或属性做什么 - 继续做您需要做的任何事情。

【讨论】:

    【解决方案2】:

    写成:

    var product = document.XPathSelectElements("//product", nameSpaceResolver).First();
    IEnumerable at = (IEnumerable)product.XPathEvaluate("catzero/@id");
    var category = at.Cast<XAttribute>().First<XAttribute>().Value;
    

    如果您期望 category 的值为 20,对我来说很好。

    【讨论】:

      【解决方案3】:

      它对我来说很好用(修复First() 中的FValue 中的V,并传递null 命名空间解析器),给出类别“20”。你期待不同的东西吗?如果是这样,是什么以及为什么?

      同样:

      string category = document.Descendants("product").First()
                   .Elements("catzero").Attributes("id").First().Value;
      

      给出“20”。

      【讨论】:

        【解决方案4】:

        您是否在 Xelement() 中输入 Xpath 表达式?
        要使用 Xpath,您应该尝试 http://msdn.microsoft.com/en-us/library/system.web.ui.templatecontrol.xpathselect.aspx

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-10-29
          • 2022-06-15
          • 2011-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-19
          相关资源
          最近更新 更多