首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nokogiri XML Builder Newlines谜语

Nokogiri XML Builder Newlines谜语
EN

Stack Overflow用户
提问于 2022-04-30 15:08:21
回答 1查看 41关注 0票数 0

为了构建大型且相当繁琐的AIXM ( XML )文件,我目前正在从" builder“gem切换到Nokogiri的内置XML构建器。DocumentFragment非常方便地构建用于组装最终文档的块。

大多数DocumentFragment都有一个容器,所有的东西都能像魅力一样工作:

代码语言:javascript
复制
require 'nokogiri'

Nokogiri::XML::DocumentFragment.parse('').tap do |document|
  Nokogiri::XML::Builder.with(document) do |builder|
    builder.root do |root|
      root.foo('bar')
      root.fii('bir')
    end
  end
end.to_xml
代码语言:javascript
复制
<root>
  <foo>bar</foo>
  <fii>bir</fii>
</root>

不幸的是,一些DocumentFragment仅仅包含了一些元素。由于某些原因,结果不再格式化,一切都在一行上结束:

代码语言:javascript
复制
require 'nokogiri'

Nokogiri::XML::DocumentFragment.parse('').tap do |document|
  Nokogiri::XML::Builder.with(document) do |builder|
    builder.foo('bar')
    builder.fii('bir')
  end
end.to_xml
代码语言:javascript
复制
<foo>bar</foo><fii>bir</fii>

是否有像容器版本中那样在每个元素之后有新闻行的方法?

(我一直在寻找方法将文档的一部分提取到一个新的DocumentFragment中,例如,使用第一个示例来构建,然后提取一个只包含root子程序的DocumentFragment。)

谢谢你的帮忙!

EN

回答 1

Stack Overflow用户

发布于 2022-04-30 16:49:43

让我自己回答这个问题:

从我所读到的关于使用libxml2的其他实现的文章来看,这似乎是libxml2的一个“特性”,而不是发生在Nokogiri的末端。

无论如何,我正在解决这个可读性问题,就像现在这样:

代码语言:javascript
复制
def build_fragment
  Nokogiri::XML::DocumentFragment.parse('').tap do |document|
    Nokogiri::XML::Builder.with(document) do |builder|
      yield builder
    end
    document.elements.each { _1.add_next_sibling("\n") }   # add newline between tags on top level
  end
end

然后使用它:

代码语言:javascript
复制
build_fragment do |builder|
  builder.foo('bar')
  builder.fii('bir')
end

得到:

代码语言:javascript
复制
<foo>bar</foo>
<fii>bir</fii>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72069646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档