go的xml命名空间前缀问题

时间:2018-02-04 15:16:43

标签: xml go xml-namespaces

编组和解组与xml名称空间前缀

无法正常工作
  

转到版本1.9.2   见下面的代码:

package main

import (

    "fmt"
    "encoding/xml")

type DeviceId struct {
    XMLName      xml.Name `xml:"DeviceId"`
    Manufacturer string   `xml:"Manufacturer"`
    OUI          string   `xml:"OUI"`
    ProductClass string   `xml:"ProductClass"`
    SerialNumber string   `xml:"SerialNumber"`
}

type CwmpInform struct {
    XMLName xml.Name `xml:"cwmp:Inform"`
    DeviceId     DeviceId      
}


func main() {
    rq := new(CwmpInform)
    data := `<cwmp:Inform>
                <DeviceId>
                <Manufacturer></Manufacturer>
                <OUI>48BF74</OUI>
                <ProductClass>FAP</ProductClass>
                <SerialNumber>1202000042177AP0008</SerialNumber>
                </DeviceId>
              </cwmp:Inform>`

    xml.Unmarshal([]byte (data), rq)
    fmt.Printf("Unmarshelled Content:%v", rq)
    output, err := xml.MarshalIndent(rq,"  ", "  ")
    if err != nil{
    fmt.Printf("error : %v", err)
    }
    fmt.Printf("Marshelled Content: %s\n", string(output))
}

使用适当的编组内容和空标记内容输出上述程序:

Unmarshelled Content:&{{ } {{ }    }}
 Marshelled Content: 
  <cwmp:Inform>
    <DeviceId>
      <Manufacturer></Manufacturer>
      <OUI></OUI>
      <ProductClass></ProductClass>
      <SerialNumber></SerialNumber>
    </DeviceId>
  </cwmp:Inform>

但是当我将结构的xml标记从xml:"cwmp:Inform"更改为xml:"cwmp Inform"时,Unmarshelling正常发生,但我的输出低于Marshelled内容:

<Inform xmlns="cwmp">
    <DeviceId>
      <Manufacturer></Manufacturer>
      <OUI>48BF74</OUI>
      <ProductClass>FAP</ProductClass>
      <SerialNumber>1202000042177AP0008</SerialNumber>
    </DeviceId>
  </Inform>

我没有获得<cwmp:Inform>,而是获得<Inform xmlns="cwmp">

  • 是否有任何解决 marshelled内容的工作?是一个 去语言问题?

1 个答案:

答案 0 :(得分:4)

这可能是同样的问题

https://github.com/golang/go/issues/9519

要解决此问题,您需要使用两个结构,一个用于Unmarshalling,另一个用于编组数据

type CwmpInformUnmarshal struct {
    XMLName  xml.Name `xml:"Inform"`
    DeviceId DeviceId
}

type CwmpInformMarshall struct {
    XMLName  xml.Name `xml:"cwmp:Inform"`
    DeviceId DeviceId
}