【问题标题】:How do I properly insert an XML document into another using rexml?如何使用 rexml 将 XML 文档正确插入另一个文档?
【发布时间】:2010-03-04 00:08:18
【问题描述】:

我已经设法弄清楚我的问题的主要部分,“我如何将一个 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 教程中很清楚地写了,我只是假设有其他问题而忽略了它。我想我会提交这个,以防其他人对此感到困惑。如果有人有这些方面的提示,我很乐意听到。

【问题讨论】:

    标签: xml ruby rexml


    【解决方案1】:

    REXML 正在按照您的要求做:doc.root.insert_after('//email', subdoc.root) 表示将 subdoc.root 放在最后一个 email 元素之后。最后一个email 元素正好在&lt;/email&gt; 中的&gt; 之后结束。

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-01
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      相关资源
      最近更新 更多