for node in root.iter(): # 如果节点不是顶层节点 if node != root: # 判断节点是否被包含 found = False prev_node = node.getprevious() while prev_node is not None: if isinstance(prev_node, ET.Comment) and re.search(r"XX_HLR_NUM", prev_node.text) and re.search(r"END", prev_node.tail): found = True break prev_node = prev_node.getprevious() if not found: # 输出行号 line_number = xml_string[:node.sourceline].count("\n") + 1 print("节点 %s 没有被包含,行号为 %d" % (node.tag, line_number)) 代码报错AttributeError: 'xml.etree.ElementTree.Element' object has no attribute 'getprevious'
时间: 2024-02-13 07:06:45 浏览: 24
这个错误通常是因为当前节点在其父元素中是第一个节点,没有前一个节点,因此没有getprevious()方法。你可以在调用getprevious()方法前,先判断一下该节点是否有前一个节点。可以使用Element.getparent().findall()方法获取所有同级节点,然后判断当前节点是否是第一个节点,如果是,则不要调用getprevious()方法。
你可以修改代码如下:
```
for node in root.iter():
# 如果节点不是顶层节点
if node != root:
# 判断节点是否被包含
found = False
prev_node = None
siblings = node.getparent().findall(node.tag)
if len(siblings) > 1:
index = siblings.index(node)
prev_node = siblings[index-1]
while prev_node is not None:
if isinstance(prev_node, ET.Comment) and re.search(r"XX_HLR_NUM", prev_node.text) and re.search(r"END", prev_node.tail):
found = True
break
siblings = prev_node.getparent().findall(prev_node.tag)
if len(siblings) > 1:
index = siblings.index(prev_node)
prev_node = siblings[index-1]
else:
prev_node = None
if not found:
# 输出行号
line_number = xml_string[:node.sourceline].count("\n") + 1
print("节点 %s 没有被包含,行号为 %d" % (node.tag, line_number))
```
在这个修改后的代码中,我们首先使用node.getparent().findall(node.tag)方法获取所有同级节点,然后判断当前节点是否是第一个节点。如果不是第一个节点,则获取前一个节点。如果前一个节点是注释节点,并且满足条件,则将found标志设置为True。如果前一个节点不是注释节点,则继续查找前一个节点,直到找到符合条件的注释节点或者没有前一个节点为止。