错误:Minidom Python中列表索引超出范围

0 投票
2 回答
515 浏览
提问于 2025-04-17 23:38

我遇到了一个问题。我知道我想做什么,但不知道该怎么写代码。我有一些很大的XML文件。我需要打开每个文件,查找某个字符串在标签值中的出现,如果找到了就返回真。我在同一个标签下有多个相同的出现。下面是XML文件中一个这样的标签的例子。

<ulink xlink:type="simple"
xlink:href="urn:x-xxx:r2:reg-doc:*-*:*:*?title=XXX"
xlink:title="XXX" xmlns:xlink="http://www.w3.org/1999/xlink"
>XXX</ulink>.</p>

注意:我在一个文件中有很多这样的标签。我需要读取所有这些标签中的“xlink:title”内容,并与我的字符串进行比较。如果找到了,我需要打印出来。以下是我尝试过的代码。

from xml.dom.minidom import parse, parseString
import os, stat
import sys
def shahul(dir):   
    for r,d,f in os.walk(dir):
        for files in f:
            if files.endswith(".xml"):
                dom=parse(os.path.join(r, files));
                ref=dom.getElementsByTagName('ulink')
                link=ref[0].attributes['xlink:title'].value
                if "mystring" in link:
                    found=True
                    break
                print (files, found, sep='\t')

shahul("location")

注意:在上面的代码中,我使用了link=ref[0].attributes['xlink:title'].value。这是否意味着我只找到了第一个ulink标签?如果我想保存所有ulink标签的内容,我该怎么做呢?

这个索引错误是因为有多个同名的标签吗?还是说它无法保存link下的所有条目?请给我一些指导。谢谢。

2 个回答

0

当你看到 IndexErrorref[0] 这个错误时,其实是在告诉你列表是 空的,并不是说你找的标签有很多个。要处理所有找到的标签,你需要把它们放在一个循环里:

refs = dom.getElementsByTagName('ulink')
for ref in refs:
    #use ref

如果 refs 是空的,这个循环就不会执行。

1

你可以这样做:

dom=parse(os.path.join(r, files))
ref=dom.getElementsByTagName('ulink')
for n in ref:
    attr = n.getAttributeNode('xlink:title')
    if attr:
        link = attr.nodeValue.strip()
        print link 

这段代码会找到所有名字叫 ulink 的元素,并把这些元素都列出来。然后,它会检查这些元素中有没有 xlink:title 这个属性,并获取这个属性的值,然后把它打印出来。你也可以把打印的部分换成你的条件判断。

撰写回答