使用Nokogiri创建XML节点



我在创建节点并将其添加到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。

相关内容

  • 没有找到相关文章

最新更新