【问题标题】:How can I locate a tag via CSS selectors, referencing the content of a sibling tag?如何通过 CSS 选择器定位标签,引用同级标签的内容?
【发布时间】:2012-02-03 16:47:08
【问题描述】:

我正在编写一个 Ruby 脚本,它将解析和操作一些 XML 文件。我正在使用 Nokogiri 进行 XML 处理。

我遇到的问题是有几个这样的结构:

<USER_ELEMENT>
  <NAME>ATTRIBUTE01</NAME>
  <VALUE>XXX</VALUE>
</USER_ELEMENT>

我需要设置与特定&lt;VALUE&gt;ATTRIBUEnn&lt;/VALUE&gt; 相同的&lt;VALUE&gt; 标签。我目前的方法是使用

xml.css('USER_ELEMENT').find { |node| node.at_css('NAME').text == 'ATTRIBUTEnn'}.at_css('VALUE').content = 'NEW_VALUE'

但它看起来很丑。

我想知道哪种方式可以更简洁地处理这种情况?

【问题讨论】:

  • 必须是 CSS 吗? XPath 可能是更好的选择。
  • 正如我已经在其他答案的主题中回答的那样,选择 CSS 是为了保持一致性。整个应用程序依赖于 CSS 选择器,所以我宁愿坚持下去。

标签: css ruby xml nokogiri siblings


【解决方案1】:

我不知道 nokogiri 是否支持 CSS3,但如果支持,这应该可以工作

xml.css('USER_ELEMENT NAME:content("ATTRIBUTEnn") + VALUE').content = "NEW_VALUE"

【讨论】:

  • 它确实支持 CSS3,但显然只是在某种程度上。不支持content,但它没有抱怨text。问题是简单地选择忽略text 过滤器,并把我所有的&lt;USER_ELEMENT&gt; 节点都甩了...
【解决方案2】:

使用 XPath:

attnn = "ATTRIBUTE01"
xml.at_xpath("//USER_ELEMENT[NAME='#{attnn}']/VALUE").content = "Yay"
puts xml
#=> <USER_ELEMENT>
#=>   <NAME>ATTRIBUTE01</NAME>
#=>   <VALUE>Yay</VALUE>
#=> </USER_ELEMENT>

在英语中,XPath 说:

  • //USER_ELEMENT - 在文档中的任意位置查找具有此名称的元素
  • […] - 但前提是……
    • NAME="ATTRIBUTE01" - ...你可以找到带有此文本的子 NAME 元素
  • /VALUE - 现在找到子 VALUE 这些元素

【讨论】:

  • 我想你很快就会出现,给我上一堂快速的 XPath 课,这比我想象的要好。
  • 感谢您的回答。它甚至比 CSS 更简洁,但正如我所说,我想在这个项目中保留 CSS 以保持一致性。
【解决方案3】:

兄弟姐妹的 css 选择器是 ~:

xml.at('USER_ELEMENT > NAME[text()="ATTRIBUTE01"] ~ VALUE').content = 'NEW_VALUE'

【讨论】:

  • 只是加起来,@Phrogz 回答也有效。我将这个标记为正确的原因是因为它使用 CSS,而前者使用 XPath。我对 XPath 没有任何问题,但整个应用程序都是使用 CSS 定位器编写的,所以我宁愿坚持使用它以保持一致性。
猜你喜欢
  • 1970-01-01
  • 2015-10-20
  • 2017-02-12
  • 2020-07-31
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
相关资源
最近更新 更多