【问题标题】:Why can't I get the specific node under some condition?为什么在某些情况下我无法获取特定节点?
【发布时间】:2012-03-06 10:14:30
【问题描述】:

为什么这个 xpath 不适用于我?如果language _id =2,我想要当前的title

./title[language_id=2]

<news pnumber="1" id="1"><event_id>578</event_id><event_type_id>1</event_type_id><language_id>2</language_id><title>meeting</title></news>



<news pnumber="1" id="1"><event_id>578</event_id><event_type_id>1</event_type_id><language_id>1</language_id><title>meeting</title></news>

【问题讨论】:

  • 那么正确的是什么:)
  • 您的查询是针对 language_id 属性为 2 的标题元素 - 我认为您需要搜索的是父元素,然后从中提取标题 - 恐怕我不知道该怎么做。

标签: c# xml xpath xpathnavigator


【解决方案1】:

正确的 XPath 表达式是

//title[../language_id=2]

【讨论】:

    【解决方案2】:

    要避免反向轴,请使用

    self::*[language_id=2]/title.
    

    【讨论】:

    • 你能解释一下reverse axis是什么意思吗?
    • @just_name:反向轴是:parent::ancestor::ancestor-or-self::preceding-sibling::preceding::
    【解决方案3】:

    首先将根添加到您的 XML 然后:

    XDocument doc = XDocument.Load(xmlFilePath);
    
    var result=  doc.Descendants("news")
                 .Where(x=>x.Attribute("id") != null && x.Attribute("id").Value = "1")
                 .Select(x=>x.Descendants("title").First().Value);
    

    这里是这个 linq2xml 的描述:

    首先加载 XML 文件(也可以解析 xml 字符串):

    XDocument.Load(xmlFilePath);
    

    找到您的 news 元素:

    doc.Descendants("news")
    

    news元素之间选择具有id=1的元素:

    Where(x=>x.Attribute("id") != null && x.Attribute("id").Value = "1")
    

    从每个过滤的项目中选择第一个标题:

    x.Descendants("title").First().Value
    

    【讨论】:

    • 你能帮我xpath吗?
    • 我认为添加的描述足以理解它(如果您对 linq 有点熟悉),linq2xml 比 xpath 更快且 IMO 更具可读性。 linq2xml 中出现错误的可能性也小于 xpath。
    • 我需要xpath,因为我使用以下方法:lbl_date.Text = XPathBinder.Eval((((lbl_date.NamingContainer as RadRotatorItem)).DataItem), "./title", "");
    • @just_name 所以使用 Nico 的回答
    猜你喜欢
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 2021-11-01
    • 2021-09-09
    相关资源
    最近更新 更多