You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实例,没有出现类型错误。

具体排查方向

  1. 检查createDeliveries方法:确认该方法是否正确将传入的parts参数(Parts实例)赋值给Deliveries对象的parts字段,有没有误将字符串赋值进去的情况(比如参数处理错误)。
  2. 检查getParts方法:在read方法中,self.getLib().getParts(int(t[1]))是否确实返回Parts实例?如果该方法找不到对应code的零件,会不会返回字符串(比如错误提示文本)而非None?
  3. 检查Deliveries类的getParts方法:确认它返回的是Parts实例,而非字符串类型。
  4. 临时调试验证:在报错行前添加打印语句,查看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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:50:33