【问题标题】:Include one XML within another XML and parse it with python在另一个 XML 中包含一个 XML 并用 python 解析它
【发布时间】:2019-10-14 05:59:17
【问题描述】:

我想在另一个 XML 文件中包含一个 XML 文件并用 python 解析它。我正在尝试通过 Xinclude 来实现它。有一个 file1.xml 看起来像

<?xml version="1.0"?>
<root>
  <document xmlns:xi="http://www.w3.org/2001/XInclude">
     <xi:include href="file2.xml" parse="xml" />
  </document>
  <test>some text</test>
</root>

和 file2.xml 看起来像

<para>This is a paragraph.</para>

现在在我的 python 代码中,我尝试像这样访问它:

from xml.etree import ElementTree, ElementInclude

tree = ElementTree.parse("file1.xml")
root = tree.getroot()
for child in root.getchildren():
    print child.tag

它打印根的所有子元素的标签

document
test

现在当我尝试直接打印子对象时

print root.document
print root.test

它说根没有名为 test 或 document 的子级。那我应该如何访问 file2.xml 中的内容呢?

我知道我可以使用以下模式从 python 访问 XML 元素:

    schema=etree.XMLSchema(objectify.fromstring(configSchema))
    xmlParser = objectify.makeparser(schema = schema)
    cfg = objectify.fromstring(xmlContents, xmlParser)
    print cfg.elemetName # access element

但由于这里一个 XML 文件包含在另一个中,我很困惑如何编写架构。我该如何解决?

【问题讨论】:

  • 我想从 python 解析这个 XML。我可以在没有架构的情况下解析它吗?
  • 您不需要架构。您确实需要一个可以处理 XInclude 的工具或库。 lxml 可以做到:lxml.de/api.html#xinclude-and-elementinclude.
  • ElementTree 也有一些 XInclude 支持:docs.python.org/3/library/…
  • 我正在浏览那个文件。但是我怎样才能访问包含文件中的内容呢?在那里给出的示例中,当我尝试访问 root.para 时,它说对象没有属性 para。但是 para 是包含的 xml 中元素的名称。

标签: python xml schema elementtree xinclude


【解决方案1】:

不知道为什么要使用 XInclude,但是在另一个文件中包含一个 XML 文件是 SGML 和 XML 的基本机制,不用 XInclude 就可以实现,如下所示:

<!DOCTYPE root [
  <!ENTITY externaldoc SYSTEM "file2.xml">
]>
<root>
  <document>
    &externaldoc;
  </document>
  <test>some text</test>
</root>

【讨论】:

  • 要确保的一件事是包含的文件不能有 XML 或 DOCTYPE 声明。如果您一直在使用其中一个来编辑片段,请在以这种方式使用文件之前将其删除。是的,这很让人头疼,但是如果你有很多这样的包含,请编写一个脚本来剥离声明(并再次将其粘贴回去进行编辑)。 // 所以我想用Xinclude
  • 问题在于如何通过在python中包含文件的根对象来访问包含文件中的元素。
  • @HariKrishnan 等等,您是说 Python 根据是否使用实体而以不同的方式公开 XML?这将是新闻(但我已经很长时间没有使用 Python)
  • @iamhotap 请仔细阅读问题并回答问题。 1)它说根没有名为test或document的孩子。那么我想如何访问 file2.xml 中的内容呢? 2)但是由于这里一个XML文件包含在另一个中,我很困惑如何编写模式......!您可以参考 baldermans 的答案以获得更好的理解。
【解决方案2】:

下面

import xml.etree.ElementTree as ET


xml1 = '''<?xml version="1.0"?>
<root>
  <test>some text</test>
</root>'''

xml2 = '''<para>This is a paragraph.</para>'''

root1 = ET.fromstring(xml1)
root2 = ET.fromstring(xml2)

root1.insert(0,root2)

para_value = root1.find('.//para').text
print(para_value)

输出

This is a paragraph.

【讨论】:

  • 问题在于如何通过在python中包含文件的根对象来访问包含文件中的元素
  • 合并这两个文件后,您可以访问任何元素。你想访问什么?
  • 在给定的示例中,我想访问 para 元素中的内容。
  • @HariKrishnan 代码已修改,以显示如何访问 para 值。
  • 问题是将一个 XML 包含在另一个 XML 中,并从外部 XML 访问包含的内容。但是在这里,我们从 python 本身将一个 XML 内容插入到另一个中。无论如何要访问内部元素,我可以使用 root1.find('.//tagName').text。谢谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多