我在创建节点并将其添加到XML文件时遇到问题:
<mainnode>
<secnode>
<data1></data2>
<data2></data2>
</secnode>
</mainnode>
我想能够像这样添加到文件中:
<mainnode>
<secnode>
<data1></data2>
<data2></data2>
</secnode>
<secnode>
<data1></data2>
<data2></data2>
</secnode>
</mainnode>
我很难理解使用Nokogiri添加节点的概念。
这是我当前的代码:
def openXML
f = File.open("file.xml")
doc = Nokogiri::XML(f)
end
def parseXML
mainnode.name = 'mainnode'
f = openXML
temp = Nokogiri::XML::Node.new "secnode", f
mainnode.add_next_sibling(temp)
end
我缺少什么概念?
我需要能够将实例变量添加到<data1>
和<data2>
,但我发现Nokogiri教程在这方面没有太大帮助,并且还没有通过将<secnode>
节点添加为<mainnode>
的子节点。
感谢您的帮助。
在Nokogiri中添加节点比您想象的要容易得多,但您的问题并不十分清楚。
如果您想复制现有节点:
require 'nokogiri'
xml = <<EOT
<mainnode>
<secnode>
<data1></data2>
<data2></data2>
</secnode>
</mainnode>
EOT
doc = Nokogiri::XML(xml)
secnode = doc.at('secnode')
doc.root.add_child secnode.dup
puts doc.to_xml
运行时,会导致:
<?xml version="1.0"?>
<mainnode>
<secnode>
<data1/>
<data2/>
</secnode>
<secnode>
<data1/>
<data2/>
</secnode></mainnode>
时髦的对齐方式是附加用于缩进的中间文本节点的结果。生成的XML是有效的。
如果你要添加一组不同的节点,这仍然很容易:
需要"nokogiri"
xml = <<EOT
<mainnode>
<secnode>
<data1></data2>
<data2></data2>
</secnode>
</mainnode>
EOT
node_to_add = <<EOT
<secnode>
<data3 />
<data4 />
</secnode>
EOT
doc = Nokogiri::XML(xml)
doc.root.add_child node_to_add
puts doc.to_xml
哪个输出:
<?xml version="1.0"?>
<mainnode>
<secnode>
<data1/>
<data2/>
</secnode>
<secnode>
<data3/>
<data4/>
</secnode>
</mainnode>
您可以将其用作模板:
require 'nokogiri'
xml = <<EOT
<mainnode>
<secnode>
<data1></data2>
<data2></data2>
</secnode>
</mainnode>
EOT
v1 = 'foo'
v2 = 'bar'
node_to_add = <<EOT
<secnode>
<data3>#{ v1 }</data3>
<data4>#{ v2 }</data4>
</secnode>
EOT
doc = Nokogiri::XML(xml)
doc.root.add_child node_to_add
puts doc.to_xml
看起来像:
<?xml version="1.0"?>
<mainnode>
<secnode>
<data1/>
<data2/>
</secnode>
<secnode>
<data3>foo</data3>
<data4>bar</data4>
</secnode>
</mainnode>
Nokogiri通过使用XML或HTML的字符串表示创建要添加的节点非常容易,然后它会动态转换这些节点。
require 'nokogiri'
def parse_xml_file(file_name)
f = File.read(file_name)
Nokogiri::XML(f) # do not need variable here; it's the return value of the method
end
def add_element(doc, node_name)
new_element = Nokogiri::XML::Node.new(node_name, doc)
new_element.content = "anything"
doc.root.add_child(new_element)
end
doc = parse_xml_file("sample.xml")
add_element(doc, 'secnode')
puts doc.to_s
你的线路mainnode.name = 'mainnode'
什么都没做,会抛出一个错误;您还没有从XML文档中选择任何内容。
您应该了解如何遍历XMLDOM和选择节点。试试这个底漆:https://blog.engineyard.com/2010/getting-started-with-nokogiri
你说你读了Nokogiri的文档,但我也会回去重读:http://www.nokogiri.org/tutorials/searching_a_xml_html_document.html
最后,通过在IRB中解析一个文档,看看你能用它做些什么,来和nokogiri玩一玩。这是探索和感受nokogiri。