2

我已经设法弄清楚我的问题的主要部分,“如何将一个 XML 文档插入另一个?” 我得到的结果会起作用,但打印的 XML 缺少换行符。

s = <<EOF
<application>
  <email>
    <host>mail.test.com</host>
    <port>25</port>
  </email>
</application>
EOF

p = <<EOF
<auth>
  <user>godber</user>
  <pass>foo</pass>
</auth>
EOF

subdoc = REXML::Document.new(p)
doc = REXML::Document.new(s)
doc.root.insert_after( '//email', subdoc.root )
doc.write

这将输出以下内容,您可以看到 auth 标记在电子邮件关闭标记之后立即开始,没有换行符

<application>
  <email>
    <host>mail.test.com</host>
    <port>25</port>
  </email><auth>
  <user>godber</user>
  <pass>foo</pass>
</auth>
</application>

实际上,就在我完成此操作时,我意识到我可以将最后一行更改为

doc.write( $stdout, 2 )

这清楚地写在 rexml 教程中,我只是假设有其他问题而忽略了它。我想我会提交这个,以防其他人对此感到困惑。如果有人有这些方面的提示,我很乐意听到。

4

1 回答 1

2

REXML 完全按照您的要求进行: doc.root.insert_after('//email', subdoc.root)意味着放在subdoc.root最后一个email元素之后。最后一个email元素正好在>in之后结束</email>

空白节点,虽然经常被我们人类读者所忽视,但不能被 XML 解析器忽略。这里的关键是这个 XML 文档

<doc>
  <email>
  </email>
</doc>

不是由email元素内部的doc元素组成的。事实上,它是由按顺序组成的,

  • doc元素,
  • 一个带有文本“[newline][space][space]”的文本节点,
  • 包含文本节点“[newline][space][space]”的email元素,
  • 另一个带有文本“[newline]”的文本节点。

这意味着 REXML 不能以auth我们期望的方式任意添加缩进所需的空格。

解决此问题的一种方法是要求 REXML 强制重新序列化 XML 文档,这就是您使用#write具有正缩进级别的方法所做的。但只有在文档中空格不重要时才能这样做:您会让 REXML 重新格式化一段仔细缩进的 Ruby 代码片段吗?

于 2011-09-27T13:28:48.620 回答