XML文件读写报错:'str'无'getCode'属性,求排查提示
问题描述
在实现XML文件读写功能时,第81行出现报错:'str' object has no attribute 'getCode',但无法理解为何80-83行(providers相关逻辑)可正常运行。Deliveries类包含parts和providers两个其他类的字段,不清楚错误原因,请求排查提示。
原始实现代码
import os,xml.dom.minidom from data import data class dataxml(data): def read(self): dom=xml.dom.minidom.parse(self.getInp()) dom.normalize() for node in dom.childNodes[0].childNodes: if (node.nodeType==node.ELEMENT_NODE)and(node.nodeName=='providers'): code,provider,title,adres,telephone=0,"","","","" for t in node.attributes.items(): if t[0]=="code":code=int(t[1]) if t[0]=="provider":provider=t[1] if t[0]=="title":title=t[1] if t[0]=="adres":adres=t[1] if t[0]=="telephone":telephone=t[1] self.getLib().createProviders(code,provider,title,adres,telephone) if (node.nodeType==node.ELEMENT_NODE)and(node.nodeName=='parts'): code,title,articule,price,note=0,"",0,0,"" for t in node.attributes.items(): if t[0]=="code":code=int(t[1]) if t[0]=="title":title=t[1] if t[0]=="articule":articule=int(t[1]) if t[0]=="price":price=int(t[1]) if t[0]=="note":note=t[1] self.getLib().createParts(code, title, articule, price, note) if (node.nodeType==node.ELEMENT_NODE)and(node.nodeName=='deliveries'): code,providers,parts,guantity,date=0,None,None,0,"" for t in node.attributes.items(): if t[0]=="code":code=int(t[1]) if t[0]=="guantity":guantity=int(t[1]) if t[0]=="providers": providers=self.getLib().getProviders(int(t[1])) if t[0]=="parts": parts=self.getLib().getParts(int(t[1])) if t[0]=="date":date=t[1] self.getLib().createDeliveries(code,providers,parts,guantity,date) def write(self): dom=xml.dom.minidom.Document() root=dom.createElement("shop") dom.appendChild(root) for a in self.getLib().getProvidersList(): pro=dom.createElement("providers") pro.setAttribute('code',str(a.getCode())) pro.setAttribute('provider',a.getProvider()) pro.setAttribute('title',a.getTitle()) pro.setAttribute('adres',a.getAdres()) pro.setAttribute('telephone',a.getTelephone()) root.appendChild(pro) for p in self.getLib().getPartsList(): par=dom.createElement("parts") par.setAttribute('code',str(p.getCode())) par.setAttribute('title',p.getTitle()) par.setAttribute('articule',str(p.getArticule())) par.setAttribute('price',str(p.getPrice())) par.setAttribute('note',p.getNote()) root.appendChild(par) for b in self.getLib().getDeliveriesList(): de=dom.createElement("deliveries") de.setAttribute('code',str(b.getCode())) de.setAttribute('guantity',str(b.getGuantity())) de.setAttribute('date',b.getDate()) if b.getProviders(): pc=b.getProviders().getCode() else:pc="" de.setAttribute('providers',str(pc)) if b.getParts(): ppc=b.getParts().getCode() #'str' object has no attribute 'getCode' else:ppc="" de.setAttribute('parts',str(ppc)) root.appendChild(de) f = open(self.getOut(),"w") #f.write(dom.toprettyxml(encoding='utf-8')) f.write(dom.toprettyxml())
尝试的修改(引发更多错误)
for b in self.getLib().getDeliveriesList(): de=dom.createElement("deliveries") de.setAttribute('code',str(b.getCode())) de.setAttribute('guantity',str(b.getGuantity())) de.setAttribute('date',b.getDate()) de.setAttribute('providers',b.getProviders()) # de.setAttribute('parts',b.getParts()) #
排查分析与解决思路
错误核心原因
报错明确说明:调用b.getParts().getCode()时,b.getParts()返回的是字符串而非预期的Parts类实例。这意味着Deliveries对象的parts字段被错误存储为字符串类型,而非Parts对象。
为什么providers逻辑正常?
大概率是以下两种情况之一:
getProviders()方法始终能返回有效的Providers实例,从未返回过字符串;- 对应的Deliveries对象的
providers字段始终被正确赋值为Providers实例,没有出现类型错误。
具体排查方向
- 检查
createDeliveries方法:确认该方法是否正确将传入的parts参数(Parts实例)赋值给Deliveries对象的parts字段,有没有误将字符串赋值进去的情况(比如参数处理错误)。 - 检查
getParts方法:在read方法中,self.getLib().getParts(int(t[1]))是否确实返回Parts实例?如果该方法找不到对应code的零件,会不会返回字符串(比如错误提示文本)而非None? - 检查Deliveries类的
getParts方法:确认它返回的是Parts实例,而非字符串类型。 - 临时调试验证:在报错行前添加打印语句,查看
b.getParts()的类型和值:print("parts类型:", type(b.getParts()), "parts值:", b.getParts()) ppc = b.getParts().getCode()
修复建议
- 如果
getParts方法在找不到零件时返回字符串而非None,修改该方法,让它在无匹配项时返回None,这样原有的if b.getParts()判断就能生效,避免调用字符串的getCode()方法。 - 确保
createDeliveries方法严格接收Parts实例作为parts参数,禁止传入字符串类型。 - 不要直接将对象传给
setAttribute(像你尝试的修改那样),因为XML属性值必须是字符串,必须获取对象的code值后转成字符串再设置。
内容的提问来源于stack exchange,提问作者VasilinaM
相关产品推荐
相关产品推荐

