如何通过 CSS 选择器定位标签,引用同级标签的内容?

发布于 2024-12-25 07:01:48 字数 531 浏览 5 评论 0原文

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

我遇到的问题是,有几个像这样的构造:

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

我需要设置与特定 ATTRIBUEnn相同的 标记。。我目前的方法是使用

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

但它看起来相当丑陋。

我想知道哪种方式是处理这种情况的更干净的方法?

I'm working on a Ruby script that will parse and manipulate some XML files. I'm using Nokogiri for the XML handling.

The problem I have is that there are several constructs like this one:

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

I need to set the <VALUE> tag that's within the same of a particular <VALUE>ATTRIBUEnn</VALUE>. My current approach is using

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

but it looks rather ugly.

I'm wondering which would be a cleaner way of dealing with the situation?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

羁客 2025-01-01 07:01:48

使用 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 找到一个子 NAME 元素 - 现在找到该子元素其中的 VALUE 元素

Using 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>

In English, that XPath says:

  • //USER_ELEMENT - find elements with this name anywhere in the document
  • […] - but only if…
    • NAME="ATTRIBUTE01" - …you can find a child NAME element with this text
  • /VALUE - and now find the child VALUE elements of these
李白 2025-01-01 07:01:48

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

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

The css selector for siblings is ~:

xml.at('USER_ELEMENT > NAME[text()="ATTRIBUTE01"] ~ VALUE').content = 'NEW_VALUE'
忆悲凉 2025-01-01 07:01:48

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

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

I don't know if nokogiri supports CSS3, but if it does, this should work

xml.css('USER_ELEMENT NAME:content("ATTRIBUTEnn") + VALUE').content = "NEW_VALUE"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文