2010-01-09 36 views
0

任何人都知道为什么这个XPath表达式"catzero/@id"不工作在这个xml问题阅读的XElement属性

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 
+0

请给出一些示例代码并解释发生了什么 - “不工作”不是很具描述性。 – 2010-01-09 13:51:07

+1

好吧好吧.. – h3n 2010-01-12 01:16:29

回答

1

XPath和LINQ到XML(XEelement)通常不匹配 - LINQ到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; 
     } 
    } 
} 

我不从你的问题知道你想要什么用这些元素做的和/或属性 - 先走一步,做你需要做的事情。

1

写它:

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

如果你期望类的价值为20。

1

它工作正常,我(固定FFirst()正常工作对我来说,VValue ,并传递一个null命名空间解析器),给出类别“20”。你期望有什么不同吗?如果是这样,为什么?

同样:

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

给出 “20”。