简体   繁体   English

Golang-使用attr进行XML解码

[英]Golang - XML decoding with attr

I've got stuck with trying to unmarshall some XML from an old device I'm trying to read from. 我一直试图从我要读取的旧设备中解组一些XML。

The device produces XML in ISO-8859-1 format. 设备生成ISO-8859-1格式的XML。 I've managed to transcode, but am struggling to map the elements and attributes to my output model. 我已经成功进行了代码转换,但是正在努力将元素和属性映射到我的输出模型。

I've not found any questions that combine these, and don't know if this is causing the issue. 我没有发现任何将这些问题结合在一起的问题,也不知道这是否是导致问题的原因。

The issue is that not all of the XML details are being mapped to my object 问题在于,并非所有XML详细信息都被映射到我的对象

{Error:0 Context:2 LoginState:3 DI:0 DO:0 Clock:{Date:0/0/0 Time:12:54:52 Day:3} OWbus: Tmps:{Tmp:{ID:5 low: high: value:}} AOS:{AO:0} AIS:{AI:0}}

The Tmps only holds the last repeat, and the AOS and AIS are not being mapped. Tmp仅保留最后一个重复,并且未映射AOS和AIS。

Here's a standalone test wrapper with an example xml output. 这是一个带有示例xml输出的独立测试包装器。

    package main

// go-webbrck is a lightweight package that is used to control a variety the legacy webbrick products

import (
    "bytes"
    "code.google.com/p/go-charset/charset" // For XML conversion
    _ "code.google.com/p/go-charset/data"  // Specs for dataset conversion
    "encoding/xml"                         // For XML work
    "fmt"                                  // For outputting stuff
)

type Clock struct {
    Date string
    Time string
    Day  string
}

type Tmps struct {
    Tmp Tmp `xml:"Tmp"`
}

type Tmp struct {
    ID    string `xml:"id,attr"`
    low   string `xml:"low,attr"`
    high  string `xml:"high,attr"`
    value string `xml:",chardata"`
}

type AOs struct {
    AO string `xml:"AO"`
}

type AO struct {
    id string `xml:"id,attr"`
    AO string `xml:",chardata"`
}

type AIs struct {
    AI string `xml:"AI"`
}

type AI struct {
    id   string `xml:"id,attr"`
    low  string `xml:"low,attr"`
    high string `xml:"high,attr"`
    AI   string `xml:",chardata"`
}

type WebbrickStatus struct {
    Error      string
    Context    string
    LoginState string
    DI         string
    DO         string
    Clock      Clock `xml:"Clock"`
    OWbus      string
    Tmps       Tmps `xml:"Tmps"`
    AOS        AOs  `xml:"AOs"`
    AIS        AIs  `xml:"AIs"`
}

func main() {
    fmt.Println("Hello, playground")
    GetWBStatus()
}

// Get WB Status on Initilisation
func GetWBStatus() bool {

    //var msg string
    var strMsg string
    strMsg = `<?xml version="1.0" encoding="ISO-8859-1"?>
<WebbrickStatus Ver="6.1.614">
<Error>0</Error>
<Context>2</Context>
<LoginState>3</LoginState>
<DI>0</DI>
<DO>0</DO>
<Clock>
  <Date>0/0/0</Date>
  <Time>12:54:52</Time>
  <Day>3</Day>
</Clock>
<OWBus>1</OWBus>
<Tmps>
  <Tmp id="1" lo="-800" hi="384">283</Tmp>
  <Tmp id="2" lo="-800" hi="1600">0</Tmp>
  <Tmp id="3" lo="-800" hi="1600">0</Tmp>
  <Tmp id="4" lo="-800" hi="1600">0</Tmp>
  <Tmp id="5" lo="-800" hi="1600">0</Tmp>
</Tmps>
<AOs>
  <AO id="0">0</AO>
  <AO id="1">0</AO>
  <AO id="2">0</AO>
  <AO id="3">0</AO>
</AOs>
<AIs>
  <AI id="0" lo="0" hi="100">1</AI>
  <AI id="1" lo="0" hi="100">0</AI>
  <AI id="2" lo="0" hi="100">0</AI>
  <AI id="3" lo="0" hi="100">0</AI>
</AIs>
</WebbrickStatus>`

    fmt.Println("\n\n*** Setting up\n==============\n\n")
    fmt.Printf("%v", strMsg)
    msg := []byte(strMsg)

    // // Decode XML encoding
    var _wbs WebbrickStatus                   // create container to load the xml
    reader := bytes.NewReader(msg)            // create a new reader for transcoding to utf-8
    decoder := xml.NewDecoder(reader)         // create a new xml decoder
    decoder.CharsetReader = charset.NewReader // bind the reader to the decoder
    fmt.Println("*** Decoding\n")
    xmlerr := decoder.Decode(&_wbs) // unmarshall the xml
    if xmlerr != nil {
        fmt.Printf("error: %v", xmlerr)
        return false
    }

    fmt.Println("*** Result\n")

    fmt.Printf("%+v\n\n\n", _wbs)

    return true

}

Thanks 谢谢

Your modeling is very close, you just need to fix the type of the "array holder" struct elements (Tmps, AOs, AIs). 您的建模非常接近,您只需要修复“数组持有人”结构元素(Tmp,AO,AI)的类型。 Try this: 尝试这个:

type Tmps struct {
  Tmp []Tmp
}
type AOs struct {
  AO []AO
}
type AIs struct {
  AI []AI
}

Note also that the XML package will expect the XML element name to match the struct field name unless otherwise specified, so you can omit some xml:"..." tags. 还要注意,除非另外指定,否则XML包将期望XML元素名称与struct字段名称匹配 ,因此您可以省略一些xml:"..."标记。

Here is a simplified example on the go playground . 这是去操场上的简化示例

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM