【问题标题】:python and XML: how to place two documents into a single documentpython和XML:如何将两个文档放入一个文档中
【发布时间】:2012-02-05 22:52:15
【问题描述】:

这是我的代码:

def extract_infos(i):
    blabla...
    blabla calculate v...
    dom = xml.dom.minidom.parseString(v)
    return dom

doc = xml.dom.minidom.Document()
for i in range(1,100):
    dom = extract_infos(i)
    for child in dom.childNodes:
        doc.appendChild(child.cloneNode(True))

最后两行工作一次:

Traceback (most recent call last):
  File "./c.py", line 197, in <module>
    doc.appendChild(child.cloneNode(True))
  File "/usr/lib/python2.6/xml/dom/minidom.py", line 1552, in appendChild
    "two document elements disallowed")
xml.dom.HierarchyRequestErr: two document elements disallowed

所以我的问题是:如何将两个现有文档放入一个新文档中(将每个文档的根元素放入一个新的总体根元素中)。

【问题讨论】:

  • @Olivier,我的回答确实显示了如何以相当“干净”的方式将 DOM 附加到另一个,但我想你想要别的东西。我不明白您在对 Lattyware 的回答的评论中提到的解决方案。最终结果是格式良好的 XML 文档,还是它是什么?
  • @Oliver 我终于明白了你的问题——你要求在另一个 dom 的末尾添加一个 dom,但你真正想要的是获取两个文档并将它们都作为新文档的一部分,这是另一回事。前者在生成 XML 时是不可能的,因此我的回答是。另一方面,后者是。
  • @Lattyware 我可以请您相应地更新我的问题吗?我的英语很抱歉,还有改进的余地:/ 再次感谢您
  • 我已经提交了一个编辑(必须经过同行评审才能生效),我认为它阐明了您想要的内容。我会将问题表述为“如何将两个现有文档放入一个新文档中(将每个文档的根元素放入一个新的总体根元素中)。”

标签: python xml dom


【解决方案1】:

下面是如何使用 minidom 将 XML 文档附加到单个主根元素。

from xml.dom import minidom, getDOMImplementation

XML1 = """
<sub1>
 <foo>BAR1</foo>
</sub1>"""

XML2 = """
<sub2>
 <foo>BAR2</foo>
</sub2>"""

impl = getDOMImplementation()
doc = impl.createDocument(None, "root", None)

for s in [XML1, XML2]:
    elem = minidom.parseString(s).firstChild
    doc.firstChild.appendChild(elem)

print doc.toxml()

=>

<?xml version="1.0" ?><root><sub1>
 <foo>BAR1</foo>
</sub1><sub2>
 <foo>BAR2</foo>
</sub2></root>

由于附加Document对象不起作用,firstChild用于获取顶层Element

【讨论】:

  • 这正是我一直在等待的答案,thank you so much
【解决方案2】:

问题询问如何将一个 XML 文档追加到另一个,这意味着我给出了以下答案:

一个 XML 文档 must have a single root node,因此在生成有效 XML 时这是不可能的。

【讨论】:

  • 感谢您的回答,但不幸的是,我不仅问“为什么”,还问“如何”......我仍然不知道如何将整个 dom 附加到另一个。我想这与child.cloneNode(True) 有关,但我不知道如何...
  • @OlivierPons 我说的不是原因——而是“不可能”。您不能将 dom 附加到另一个 dom,因为这不会产生 XML。如果您真的想这样做,请读取文件的内容并将它们作为文本操作附加到另一个文件的末尾。这将做你想做的事,尽管结果将是无用的,因为它不是有效的 XML。
  • 这正是我所做的:转换为 XML (dom.toprettyxml(indent=" ").encode('utf-8')) 然后删除 &lt;xml&gt; 标头并连接所有类似的东西,然后我调用 dom = xml.dom.minidom.parseString(v)。完美运行,但从我的角度来看,它并不“干净”。无论如何它有效。即使我可以回答自己并提供解决方案来帮助社区,我也会检查您的答案是否有效 =)
猜你喜欢
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 2020-09-04
  • 1970-01-01
相关资源
最近更新 更多