gpt4 book ai didi

python - 使用 Python 和 minidom 进行 XML 解析

转载 作者:太空狗 更新时间:2023-10-29 16:53:49 27 4
gpt4 key购买 nike

我正在使用 Python (minidom) 来解析一个 XML 文件,该文件打印出如下所示的层次结构(此处使用缩进来显示重要的层次关系):

My Document
Overview
Basic Features
About This Software
Platforms Supported

相反,程序在节点上迭代多次并生成以下内容,打印重复的节点。 (在每次迭代时查看节点列表,很明显为什么要这样做,但我似乎无法找到一种方法来获取我正在寻找的节点列表。)

My Document
Overview
Basic Features
About This Software
Platforms Supported
Basic Features
About This Software
Platforms Supported
Platforms Supported

这是 XML 源文件:

<?xml version="1.0" encoding="UTF-8"?>
<DOCMAP>
<Topic Target="ALL">
<Title>My Document</Title>
</Topic>
<Topic Target="ALL">
<Title>Overview</Title>
<Topic Target="ALL">
<Title>Basic Features</Title>
</Topic>
<Topic Target="ALL">
<Title>About This Software</Title>
<Topic Target="ALL">
<Title>Platforms Supported</Title>
</Topic>
</Topic>
</Topic>
</DOCMAP>

这是 Python 程序:

import xml.dom.minidom
from xml.dom.minidom import Node

dom = xml.dom.minidom.parse("test.xml")
Topic=dom.getElementsByTagName('Topic')
i = 0
for node in Topic:
alist=node.getElementsByTagName('Title')
for a in alist:
Title= a.firstChild.data
print Title

我可以通过不嵌套“主题”元素来解决问题,方法是将较低级别的主题名称更改为“SubTopic1”和“SubTopic2”之类的名称。但是,我想利用内置的 XML 层次结构而不需要不同的元素名称;看来我应该能够嵌套“主题”元素,并且应该有某种方法可以知道我当前正在查看哪个级别的“主题”。

我尝试了许多不同的 XPath 函数,但都没有成功。

最佳答案

getElementsByTagName 是递归的,您将获得具有匹配标签名称的所有 后代。因为您的 Topic 包含其他也有 Titles 的 Topic,所以调用会多次获取较低的 Titles。

如果您只想请求所有匹配的直接子级,并且您没有可用的 XPath,您可以编写一个简单的过滤器,例如:

def getChildrenByTagName(node, tagName):
for child in node.childNodes:
if child.nodeType==child.ELEMENT_NODE and (tagName=='*' or child.tagName==tagName):
yield child

for topic in document.getElementsByTagName('Topic'):
title= list(getChildrenByTagName('Title'))[0] # or just get(...).next()
print title.firstChild.data

关于python - 使用 Python 和 minidom 进行 XML 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1596829/

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