无法在克隆文档中找到元素

时间:2013-05-17 14:11:54

标签: ruby xpath jruby nokogiri dup

我在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打印在一起。 我的错误在哪里?

1 个答案:

答案 0 :(得分:0)

我无法复制问题:

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。