XML 文档被解析为单个元素而不是节点序列

发布于 2024-08-26 15:24:24 字数 978 浏览 6 评论 0原文

给定的 xml 看起来像这样:

<Store>
<foo>
<book>
<isbn>123456</isbn>
</book>
<title>XYZ</title>
<checkout>no</checkout>
</foo>
<bar>
<book>
<isbn>7890</isbn>
</book>
<title>XYZ2</title>
<checkout>yes</checkout>
</bar>
</Store>

我将其作为我解析的 xmldoc:

>>> from xml.dom import minidom
>>> xmldoc = minidom.parse('bar.xml')
>>> xmldoc.toxml()
u'<?xml version="1.0" ?><Store>\n<foo>\n<book>\n<isbn>123456</isbn>\n</book>\n<t
itle>XYZ</title>\n<checkout>no</checkout>\n</foo>\n<bar>\n<book>\n<isbn>7890</is
bn>\n</book>\n<title>XYZ2</title>\n<checkout>yes</checkout>\n</bar>\n</Store>'

有没有一种简单的方法来预处理此文档,以便在解析它时,它不会被解析为单个 xml 元素?

Given xml that looks like this:

<Store>
<foo>
<book>
<isbn>123456</isbn>
</book>
<title>XYZ</title>
<checkout>no</checkout>
</foo>
<bar>
<book>
<isbn>7890</isbn>
</book>
<title>XYZ2</title>
<checkout>yes</checkout>
</bar>
</Store>

I am getting this as my parsed xmldoc:

>>> from xml.dom import minidom
>>> xmldoc = minidom.parse('bar.xml')
>>> xmldoc.toxml()
u'<?xml version="1.0" ?><Store>\n<foo>\n<book>\n<isbn>123456</isbn>\n</book>\n<t
itle>XYZ</title>\n<checkout>no</checkout>\n</foo>\n<bar>\n<book>\n<isbn>7890</is
bn>\n</book>\n<title>XYZ2</title>\n<checkout>yes</checkout>\n</bar>\n</Store>'

Is there an easy way to pre-process this document so that when it is parsed, it isn't parsed as a single xml element?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

花开浅夏 2024-09-02 15:24:24

XML 文档始终具有单个根元素。如果您不关心根元素,只需忽略它并查看它的子元素即可!

例如,使用更现代的元素树(但 minidom 在这方面提供了类似的可能性):

try:
  import xml.etree.cElementTree as et
except ImportError:
  import xml.etree.ElementTree as et

xmlin = '''<Store>
<foo>
<book>
<isbn>123456</isbn>
</book>
<title>XYZ</title>
<checkout>no</checkout>
</foo>
<bar>
<book>
<isbn>7890</isbn>
</book>
<title>XYZ2</title>
<checkout>yes</checkout>
</bar>
</Store>'''

root = et.fromstring(xmlin)

for child in root.getchildren():
  print et.tostring(child)

An XML document always has a single root element. If you don't care about the root element, just ignore it and look at its children instead!

For example, using the more modern element-tree (but minidom offers similar possibilities in this respect):

try:
  import xml.etree.cElementTree as et
except ImportError:
  import xml.etree.ElementTree as et

xmlin = '''<Store>
<foo>
<book>
<isbn>123456</isbn>
</book>
<title>XYZ</title>
<checkout>no</checkout>
</foo>
<bar>
<book>
<isbn>7890</isbn>
</book>
<title>XYZ2</title>
<checkout>yes</checkout>
</bar>
</Store>'''

root = et.fromstring(xmlin)

for child in root.getchildren():
  print et.tostring(child)
萌梦深 2024-09-02 15:24:24

xmldoc 是一个已解析的 XML 对象。 toxml() 要求它再次将自身转换回 XML 文本字符串。进一步探索:

>>> xmldoc.childNodes
[<DOM Element: Store at 0x212b788>]
>>> xmldoc.childNodes[0].childNodes
[<DOM Text node "u'\n'">, <DOM Element: foo at 0x212bcd8>, <DOM Text node "u'\n'">, <DOM Element: bar at 0x212b2d8>, <DOM Text node "u'\n'">]

然后,意识到 DOM 很难使用并阅读 ElementTree

xmldoc is a parsed XML object. toxml() asks it to convert itself back to a string of XML text again. Explore a little further:

>>> xmldoc.childNodes
[<DOM Element: Store at 0x212b788>]
>>> xmldoc.childNodes[0].childNodes
[<DOM Text node "u'\n'">, <DOM Element: foo at 0x212bcd8>, <DOM Text node "u'\n'">, <DOM Element: bar at 0x212b2d8>, <DOM Text node "u'\n'">]

Then, realize that DOM is difficult to work with and read about ElementTree.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文