【问题标题】:Cant find element in clone document在克隆文档中找不到元素
【发布时间】:2013-11-30 10:17:18
【问题描述】:

我在 JRuby (1.6.7.2) 中使用 Nokogiri (1.5.9 - java) 来复制 XML 模板并对其进行编辑。我在克隆文档中查找元素时遇到问题。

lblock = doc.xpath(".//lblock[@blockName='WINDOW_LIST']").first
lblock.children = new_children # kind of NodeSet or Node
copy_doc = doc.dup( 1 ) # or dup(0)
lblock = copy_doc.xpath(".//lblock[@blockName='WINDOW_LIST']").first # nil

当打印to_sto_xml 时,所以lblocknew_children 一起出现。 我的错在哪里?

【问题讨论】:

  • .//lblock 表示在 current 节点下找到 lblock。也许duped 文档没有当前节点?您是否尝试过绝对 XPath 而不是相对?

标签: ruby xpath jruby nokogiri dup


【解决方案1】:

我无法复制问题:

require 'nokogiri'

new_children = Nokogiri::XML::DocumentFragment.parse('<foo>bar</foo>')
doc = Nokogiri::XML(<<EOF)
<xml>
    <lblock blockName="WINDOW_LIST" />
</xml>
EOF

lblock = doc.xpath(".//lblock[@blockName='WINDOW_LIST']").first
lblock.children = new_children # kind of NodeSet or Node
copy_doc = doc.dup(1) # or dup(0)
lblock = copy_doc.xpath(".//lblock[@blockName='WINDOW_LIST']").first # nil

puts lblock.to_xml
puts
puts doc.to_xml

运行输出:

<lblock blockName="WINDOW_LIST">
  <foo>bar</foo>
</lblock>

<?xml version="1.0"?>
<xml>
  <lblock blockName="WINDOW_LIST"><foo>bar</foo></lblock>
</xml>

也就是说,这里的代码经过整理,向您展示了一些更简单的编写方法:

require 'nokogiri'

new_children = '<foo>bar</foo>'
doc = Nokogiri::XML(<<EOF)
<xml>
  <lblock blockName="WINDOW_LIST" />
</xml>
EOF

lblock = doc.at_xpath('//lblock')
lblock.children = new_children
copy_doc = doc.dup(1)
lblock = copy_doc.at_css('lblock')

puts lblock.to_xml
puts
puts doc.to_xml

运行后也会输出这个:

<lblock blockName="WINDOW_LIST">
  <foo>bar</foo>
</lblock>

<?xml version="1.0"?>
<xml>
  <lblock blockName="WINDOW_LIST"><foo>bar</foo></lblock>
</xml>

剖析代码:

lblock = doc.at_xpath('//lblock')
lblock = copy_doc.at_css('lblock')

它们使用两种不同的方法来寻找相同的东西。在本例中,因为示例 XML 很简单,所以我使用了at,它返回第一个匹配节点。 at_xpathat_css 分别使用 XPath 和 CSS。 at 会尝试找出字符串是 CSS 还是 XPath,并且通常会正确,尽管我看到它被愚弄了。

lblock.children = new_children

在这种情况下,new_children 是一个字符串。 Nokogiri 足够聪明,知道它应该在使用之前将字符串转换为 XML 片段。这使得使用字符串修改 XML 或 HTML 文档变得非常容易,而不必创建 DocumentFragments。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2015-06-22
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多