duanke6057 2019-08-31 08:58
浏览 78

如何使用Go to struct list格式化该xml?这个xml标签名称相同,只是id不同

I had a xml code, I want to format xml to struct list. I try to use “encoding/xml”, but the api not support filter by ID inside the tag. I want to format unionBankNo and bankName, but error. Please tell me there is a better solution?

this is my xml

<?xml version="1.0" encoding="utf-8"?>

<kColl id="noSessionSrvData" append="false"> 
  <field id="EMPException"/>  
  <field id="errorMessage"/>  
  <field id="customerId"/>  
  <field id="provinceCode"/>  
  <field id="provinceName"/>  
  <field id="cityCode" value="1000"/>  
  <field id="bankName"/>  
  <field id="bankType" value="104"/>  
  <field id="configName"/>  
  <field id="electricNo"/>  
  <field id="orderFlowNo"/>  
  <field id="dateTime"/>  
  <iColl id="iCityInfo" append="false"></iColl>  
  <iColl id="iBankInfo" append="false"> 
    <kColl id="null" append="false"> 
      <field id="unionBankNo" value="104100006610"/>  
      <field id="bankName" value="中国银行股份有限公司北京百子湾支行"/> 
    </kColl>  
    <kColl id="null" append="false"> 
      <field id="unionBankNo" value="104100004013"/>  
      <field id="bankName" value="中国银行股份有限公司北京市分行"/> 
    </kColl>  
    <kColl id="null" append="false"> 
      <field id="unionBankNo" value="104100004048"/>  
      <field id="bankName" value="中国银行股份有限公司北京崇文门支行"/> 
    </kColl>  
  </iColl>  
  <iColl id="iPayUseList" append="false"></iColl>  
  <iColl id="iBankNotice" append="false"></iColl>  
  <iColl id="iOrderList" append="false"></iColl>  
  <field id="activateCode"/>  
  <field id="payAccountOpenNode"/>  
  <iColl id="iCityBank" append="false"></iColl>  
  <field id="transferTowardType"/>  
  <field id="errorCode"/>  
  <field id="chargeFee"/>  
  <field id="userAlias"/>  
  <field id="password"/>  
  <field id="passwordEncrypted"/>  
  <field id="oldPassword"/>  
  <field id="passwordOld"/>  
  <field id="passwordNew"/>  
  <field id="userid"/>  
  <field id="flowId"/>  
  <field id="uifAlias"/>  
  <field id="stt"/>  
  <field id="queryNumber"/>  
  <field id="flagNo"/>  
  <field id="userId"/>  
  <field id="openDate"/>  
  <field id="turnPageBeginPos" value="1"/>  
  <field id="turnPageShowNum" value="10"/>  
  <field id="turnPageTotalNum"/>  
  <field id="queryType"/>  
  <field id="PBA_ID"/>  
  <field id="PBA_TYPE "/>  
  <field id="PBA_TITLE "/>  
  <field id="PBA_CONTENT "/>  
  <field id="PBA_TELLERNO "/>  
  <field id="PBA_DATETIME "/>  
  <field id="PBA_ACTIVEDATE "/>  
  <field id="PBA_EXPIREDATE "/>  
  <field id="PBA_STT "/>  
  <iColl id="iANNOUNCE" append="false"></iColl>  
  <iColl id="iUnionBankList" append="false"></iColl>  
  <field id="abateDate"/>  
  <field id="Dueday"/>  
  <field id="_ServletRequest" value=""/>  
  <field id="retValue" value="0"/> 
</kColl>

this is my struct

type UnionInfo struct {
    UnionNo string `xml:"field>[@id='unionBankNo']>id,attr"`
    BankName string `xml:"field>[@id='bankName']>id,attr"`
}

type Result struct {
    XMLName xml.Name `xml:"kColl"`
    Name    string
    City   string    `xml:"field>[@id='cityCode']>value,attr"`
    Province string
    UnionInfo []UnionInfo `xml:"iColl/kColl"`
}
err = xml.Unmarshal([]byte(body), &v)
    if err != nil {
        fmt.Printf("error: %v", err)
        return
    }

    fmt.Println(string(body))
    fmt.Println(v)

error: xml: field>[@id='cityCode']>value chain not valid with attr flagExiting.

  • 写回答

1条回答 默认 最新

  • dongpan1871 2019-08-31 09:50
    关注

    With encoding/xml you can first parse the xml into the correct structure and then after that filter the necessary stuff yourself. Whether there's a 3rd party package that makes this simpler I don't know...

    type KColl struct {
        Id     string  `xml:"id,attr"`
        Append bool    `xml:"append,attr"`
        Fields []Field `xml:"field"`
        IColls []IColl `xml:"iColl"`
    }
    
    type IColl struct {
        Id     string  `xml:"id,attr"`
        Append bool    `xml:"append,attr"`
        KColls []KColl `xml:"kColl"`
    }
    
    type Field struct {
        Id    string `xml:"id,attr"`
        Value string `xml:"value,attr"`
    }
    
    func main() {
        var k KColl
        if err := xml.Unmarshal(data, &k); err != nil {
            panic(err)
        }
    
        var res Result
        for _, f := range k.Fields {
            if f.Id != "cityCode" {
                continue
            }
            res.City = f.Value
            break
        }
        for _, i := range k.IColls {
            if i.Id != "iBankInfo" {
                continue
            }
    
            for _, j := range i.KColls {
                var info UnionInfo
                for _, f := range j.Fields {
                    if f.Id == "unionBankNo" {
                        info.UnionNo = f.Value
                    }
                    if f.Id == "bankName" {
                        info.BankName = f.Value
                    }
                }
                res.UnionInfo = append(res.UnionInfo, info)
    
            }
        }
        fmt.Printf("%+v
    ", res)
    }
    

    https://play.golang.org/p/W4LnMLKVa8z

    评论

报告相同问题?

悬赏问题

  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥20 为什么我写出来的绘图程序是这样的,有没有lao哥改一下
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥200 关于#c++#的问题,请各位专家解答!网站的邀请码
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号