【问题标题】:Nokogiri, find XML node with multiple attributes and change textNokogiri,查找具有多个属性的 XML 节点并更改文本
【发布时间】:2013-12-12 21:32:46
【问题描述】:

我正在尝试更改一个 indl 文件。 indl 文件是 Adob​​e Indesign 为保持文档结构而创建的文件,基本上是 XML。我想使用 Nokogiri 查找一些选定的 XML 节点并用我的文本替换文本,然后将 xml 保存到另一个文件。

XML 当然很奇怪:我找到了一些文档来检索带有 Nokogiri 更改文本的 HTML 标记,但我不知道如何管理这样的一段 XML:

<cflo>
<txsr prst="o_u5084" crst="o_u5085" trak="D_10">
    <pcnt>c_tEST</pcnt>
</txsr>
<txsr prst="o_u5086" crst="o_u5c" trak="D_20">
 <pcnt>c_Titolo titolo titolo</pcnt>
</txsr>
<cflo>

基本上我需要寻找prstcrst属性的组合并替换pcnt节点内的内容。

我试试这个

@doc.xpath("//txsr[prst='o_u5086' and crst='o_u5085']")

但我不知道如何更改 pcnt 节点内的文本。

【问题讨论】:

标签: ruby xml xml-parsing nokogiri


【解决方案1】:
  1. 这不是正确的 XPath。正确的 XPath 如下所示:

    @doc.xpath("//txsr[@prst='o_u5086'][@crst='o_u5085']")
    
  2. 您应该只取集合中的第一个节点并使用inner_html= 方法替换文本值。

完整代码可以在这里找到:https://gist.github.com/kaineer/7673698

【讨论】:

  • MMh... 选择器正在工作。我现在检索元素的内容,但我无法更改它。未定义的方法 inner_html :(
  • 在我看来,您已经丢失了部分输出。当我将 xpath 修改为你的时,我得到了“nil:NilClass 的未定义方法 `inner_html='”。这是显而易见的。由于 xpath 错误,您无法从 XML DOM 获取节点,并且您无法修改未获取的节点的内容。让我告诉你为什么你的 xpath 是错误的。它不会测试属性的值,因为您需要 @ 符号才能这样做。不过,使用 'and' 而不是乘方括号,证明自己是正确的 :) 所以,@doc.xpath("//txsr[@prst='o_u5086' and @crst='o_u5085']") 也可以。跨度>
  • 同样,如果您不在 xpath 的尾部添加“/pcnt”,则需要更多代码才能进入 pcnt 节点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多