gpt4 book ai didi

xml - 如何使用 rexml 将 XML 文档正确地插入到另一个文档中?

转载 作者:太空宇宙 更新时间:2023-11-03 16:11:37 25 4
gpt4 key购买 nike

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

最佳答案

REXML 完全按照您的要求执行:doc.root.insert_after('//email', subdoc.root)意思是放subdoc.root就在最后一个email之后元素。最后一个 email元素恰好在 > 之后结束在 </email> .

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

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

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

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

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

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

关于xml - 如何使用 rexml 将 XML 文档正确地插入到另一个文档中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2376014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com