【问题标题】:Using XPath to find the value of an attribute in a node based on another attribute in the same node?使用 XPath 根据同一节点中的另一个属性查找节点中某个属性的值?
【发布时间】:2009-10-05 20:24:55
【问题描述】:

我有一个构造很差的 xml 文档——而不是子节点,项目有多个属性。

例如:

<makes>
<option make="FORD" year_start="1950" year_end="2009" />
<option make="CHEVROLET" year_start="1965" year_end="2009" />
...
</makes>

我正在尝试使用 XPath 为与某个属性匹配的所有节点选择其他属性的值。我正在填充 3 个 asp 下拉菜单,其中包含基于先前选择的 2 个 xml 文档的值。我正在使用 .net/c#

例如: 对于所有具有值为 x 的 make 属性的选项节点,找到 year_start 的值。

我尝试过这样的事情:

  yearListData.XPath = string.Format("/makes/option[@year_start] and [@make={0}]", make);

其中 make = 先前的选择。显然,它没有用。

有没有办法使用 XPath 来做到这一点?

【问题讨论】:

    标签: c# .net xml xpath


    【解决方案1】:
    /makes/option[@year_start and @make="FORD"]/@year_start
    

    您可以在[] 中结合AND/OR 条件,然后请求属性。

    【讨论】:

    • 谓词中的@year_start 可能有点矫枉过正,因为它不能返回不存在的东西,但它会给出正确的答案。
    • 我把它留在那里是为了强调表达式可以在谓词中组合的观点。
    • 这对我有用,但我仍然遇到问题;你能推荐一个好的 .net/c# & xml 资源吗?
    【解决方案2】:
    /makes/option[@make='FORD']/@year_start
    

    ...将在 make 为“FORD”的选项下为您提供所有 year_start 属性。如果存在一对一的关系,属性通常比子元素更可取——它们不需要详细的结束标记。

    您也可以考虑使用 linq to XML。

    【讨论】:

      【解决方案3】:

      我不知道这是否可行,但我认为您可以通过以下方式实现:

      
      string.Format("/makes/option[@make={0}]//@year_start",make);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-13
        • 2016-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多