你的两个例子令人困惑:它们都表现出完全相同的行为,但你说其中一个做了不同的事情。
据我所知,指定noblanks
永远不会摆脱空节点:
xml.xml:
<?xml version="1.0"?>
<root>
<installation id="ayfw-a"></installation>
<dog></dog>
<cat/>
</root>
.
require 'nokogiri'
data = Nokogiri::XML(IO.read('xml.xml')) { |doc| doc.noblanks }
puts data
--output:--
<?xml version="1.0"?>
<root>
<installation id="ayfw-a"/>
<dog/>
<cat/>
</root>
我希望输出是:
<root>
<installation id="ayfw-a"></installation>
</root>
当然,可怕的 Nokogiri 文档(典型的 Ruby)并没有定义什么是空白节点。显然,这样做的程度noblanks
是像这样转换节点:
<dog></dog>
至:
<dog/>
啊,所以你的问题在于你的 XML 的漂亮打印。好的,我看到了和你一样的问题。让我向您展示如何提出您的问题:
我无法按照我想要的方式格式化我的 XML:
xml.xml:
<?xml version="1.0"?>
<installation id="ayfw-a">
</installation>
.
require 'nokogiri'
data = Nokogiri::XML(IO.read('xml.xml')) {|doc| doc.noblanks}
new_record = Nokogiri::XML::Node.new('tag', data)
data.root.add_child(new_record)
puts data.to_xml(indent: 4, indent_text: ".")
--output:--
<?xml version="1.0"?>
<installation id="ayfw-a">
<tag/></installation>
该to_xml()
方法似乎无法正常工作。我预计输出是:
<?xml version="1.0"?>
<installation id="ayfw-a">
....<tag/>
</installation>
但是,to_xml()
当标签具有预先存在的子节点时,该方法会按照我想要的方式格式化输出:
xml.xml:
<?xml version="1.0"?>
<installation id="ayfw-a">
<dog>Rover</dog>
</installation>
.
require 'nokogiri'
data = Nokogiri::XML(IO.read('xml.xml')) {|doc| doc.noblanks}
new_record = Nokogiri::XML::Node.new('tag', data)
data.root.add_child(new_record)
puts data.to_xml(indent: 4, indent_text: ".")
--output:--
<?xml version="1.0"?>
<installation id="ayfw-a">
....<dog>Rover</dog>
....<tag/>
</installation>
在第一种情况下,如何让 Nokogiri 按照我想要的方式格式化输出?
看起来 Nokogiri 没有一台非常好的漂亮打印机。似乎 REXML 有比 Nokogiri 更好的漂亮打印机:
xml.xml:
<?xml version="1.0"?>
<installation id="ayfw-a">
</installation>
.
require 'nokogiri'
data = Nokogiri::XML(IO.read('xml.xml')) {|doc| doc.noblanks}
new_record = Nokogiri::XML::Node.new('tag', data)
data.root.add_child(new_record)
puts data.to_xml(indent: 4, indent_text: ".")
require "rexml/document"
REXML::Document.new(data.to_xml).write(File.open("output.txt", "w"), indent_spaces = 4)
--output:--
<installation id="ayfw-a">
<tag/></installation>
$ cat output.txt
<?xml version='1.0'?>
<installation id='ayfw-a'>
<tag/>
</installation>