xml.dom.minidom解析PropertySetProperty时Value文本获取失败求助
问题原因与解决方法
问题原因
你出错的核心是混淆了元素节点和文本节点的层级:
- 获取Key文本时,
property.firstChild.firstChild.data是先拿到<Key>元素节点,再取它内部的文本节点(也就是PackageIsPublic所在的节点),所以能正常获取.data。 - 但获取Value时,
property.firstChild.nextSibling直接拿到的是<Value>元素节点本身,元素节点没有.data属性,自然报错。你移除.data后打印出的<DOM Element: Value...>也验证了这一点——你拿到的是元素,不是它内部的文本。
可靠的解决方法
不要依赖firstChild、nextSibling这种容易被XML空白(缩进、换行)干扰的节点定位方式,直接通过标签名查找元素,再获取文本内容:
修正后的代码
import xml.dom.minidom as DOM def changeProps(sddraftPath): # 解析XML文档 doc = DOM.parse(sddraftPath) # 获取所有PropertySetProperty节点 properties = doc.getElementsByTagName('PropertySetProperty') for prop in properties: # 定位Key元素并获取文本 key_elem = prop.getElementsByTagName('Key')[0] key_text = key_elem.firstChild.data # 定位Value元素并获取文本 value_elem = prop.getElementsByTagName('Value')[0] value_text = value_elem.firstChild.data print(key_text, value_text) # 示例:修改PackageIsPublic的值为true if key_text == 'PackageIsPublic': value_elem.firstChild.data = 'true' # 保存修改后的XML文件 with open(sddraftPath, 'w', encoding='utf-8') as f: doc.writexml(f, indent=' ', addindent=' ', newl='\n', encoding='utf-8')
更简洁的写法(利用textContent)
minidom的元素节点支持textContent属性,可以直接获取元素内的文本内容,无需手动找文本节点:
import xml.dom.minidom as DOM def changeProps(sddraftPath): doc = DOM.parse(sddraftPath) properties = doc.getElementsByTagName('PropertySetProperty') for prop in properties: key_text = prop.getElementsByTagName('Key')[0].textContent value_text = prop.getElementsByTagName('Value')[0].textContent print(key_text, value_text) if key_text == 'PackageIsPublic': prop.getElementsByTagName('Value')[0].firstChild.data = 'true' with open(sddraftPath, 'w', encoding='utf-8') as f: doc.writexml(f, indent=' ', addindent=' ', newl='\n', encoding='utf-8')
为什么原来的Key能正常获取?
你代码里的property.firstChild恰好指向了<Key>元素节点(可能你的XML里没有多余空白,或者minidom解析时忽略了部分空白),所以property.firstChild.firstChild就是<Key>内部的文本节点,能拿到.data。但这种写法完全依赖XML的节点顺序和格式,一旦XML有缩进变化就会出错,非常不稳定。
内容的提问来源于stack exchange,提问作者Angie
相关产品推荐
相关产品推荐

