使用lxml解析XML时元素文本含多余换行空格的问题求助
解决XML解析中文本含多余换行和空格的问题
问题背景
使用Python lxml库解析XML文件,已准确定位到目标元素mediumBitmap,但获取的node.text包含大量换行符和缩进空格(如"\n 10000000 \n"),无法与预期值"10000000"匹配。XML文件为项目标准文件不可修改,尝试remove_blank_text=True参数及改用minidom均未解决问题。
解决方案
方法1:对获取的文本做字符串清理
直接使用Python字符串的strip()方法去除文本首尾的空白字符(包括换行、空格、制表符等);若文本中间存在多余空白,可结合replace()或正则表达式进一步处理。
修改原代码的判断逻辑部分:
from lxml import etree sigxml = etree.parse('D:/LocalSpark/bitmap.xml', etree.XMLParser(load_dtd=True)) xpath = '/OneMessage[@Name="NR RRCReconfiguration"]/BalongMessage/Content/L3MessageContent/DL-DCCH-Message/message/c1/rrcReconfiguration/criticalExtensions/rrcReconfiguration/measConfig/measObjectToAddModList/MeasObjectToAddMod/measObject/measObjectNR/referenceSignalConfig/ssb-ConfigMobility/ssb-ToMeasure/setup/mediumBitmap' info = "10000000" # 改为字符串类型,避免类型不匹配 for node in sigxml.xpath(xpath): cleaned_text = node.text.strip() # 清理首尾空白 print('清理后文本:', cleaned_text) if info == cleaned_text: print(f"{info} info do exist!") else: print(f"{info} info do not exist!!!")
方法2:使用XPath的normalize-space()函数
在XPath查询阶段直接处理文本,normalize-space()会去除文本首尾空白,并将中间的连续空白替换为单个空格,完美适配XML格式化产生的冗余空白。
方式A:直接获取处理后的文本
修改XPath表达式,直接返回清理后的文本值:
from lxml import etree sigxml = etree.parse('D:/LocalSpark/bitmap.xml', etree.XMLParser(load_dtd=True)) # 用normalize-space包裹目标节点的text() xpath = 'normalize-space(/OneMessage[@Name="NR RRCReconfiguration"]/BalongMessage/Content/L3MessageContent/DL-DCCH-Message/message/c1/rrcReconfiguration/criticalExtensions/rrcReconfiguration/measConfig/measObjectToAddModList/MeasObjectToAddMod/measObject/measObjectNR/referenceSignalConfig/ssb-ConfigMobility/ssb-ToMeasure/setup/mediumBitmap/text())' info = "10000000" cleaned_text = sigxml.xpath(xpath)[0] # 获取第一个匹配结果 print('清理后文本:', cleaned_text) if info == cleaned_text: print(f"{info} info do exist!") else: print(f"{info} info do not exist!!!")
方式B:定位节点后再用XPath清理
若需保留节点操作,可在获取节点后,通过节点的xpath()方法调用normalize-space():
from lxml import etree sigxml = etree.parse('D:/LocalSpark/bitmap.xml', etree.XMLParser(load_dtd=True)) xpath = '/OneMessage[@Name="NR RRCReconfiguration"]/BalongMessage/Content/L3MessageContent/DL-DCCH-Message/message/c1/rrcReconfiguration/criticalExtensions/rrcReconfiguration/measConfig/measObjectToAddModList/MeasObjectToAddMod/measObject/measObjectNR/referenceSignalConfig/ssb-ConfigMobility/ssb-ToMeasure/setup/mediumBitmap' info = "10000000" for node in sigxml.xpath(xpath): cleaned_text = node.xpath('normalize-space()')[0] print('清理后文本:', cleaned_text) if info == cleaned_text: print(f"{info} info do exist!") else: print(f"{info} info do not exist!!!")
补充说明
remove_blank_text=True参数无效的原因:该参数仅用于移除元素之间的空白文本节点(如标签换行产生的空白节点),而目标元素内部的换行和缩进属于该元素的文本内容,不属于元素间空白,因此不会被处理。
内容的提问来源于stack exchange,提问作者Aiyu Sheng
相关产品推荐
相关产品推荐

