Как разобрать XML с помощью Unmarshal - PullRequest
0 голосов
/ 01 марта 2020

Я кодировал очень простой XML парсер в Go, но моя функция xml .Unmarshal не работает должным образом. Это пример кода.

Я не уверен, правильна ли моя структура или нет. Я прочитал несколько страниц и думаю, что этот формат более организован.

package main

import (
   "fmt"
   "encoding/xml"
)

//this a xml sample of my document. 

var str = `<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
    <mensagem>
        <cabecalho>
            <identificacaoTransacao>
                <tipoTransacao>DESCRICAO</tipoTransacao>
                <sequencialTransacao>5443811</sequencialTransacao>
                <dataRegistroTransacao>2020-02-27</dataRegistroTransacao>
                <horaRegistroTransacao>17:35:11</horaRegistroTransacao>
            </identificacaoTransacao>
            <origem>
                <registroANS>005711</registroANS>
            </origem>
            <destino>
                <identificacaoPrestador>
                    <codigoPrestadorNaOperadora>687146</codigoPrestadorNaOperadora>
                </identificacaoPrestador>
    </destino>
    <Padrao>3.03.03</Padrao>
    </cabecalho>
</mensagem>`

    type XmlTISSIndex struct {
            XMLCabecalho struct {
                XMLAnsIdentificacaoTransacao struct {
                    XMLAnstipoTransacao         string `xml:"tipoTransacao"`
                    XMLAnsSequenciaTransacao    string `xml:"sequencialTransacao"`
                    XMLAnsDataRegistroTransacao string `xml:"dataRegistroTransacao"`
                    XMLAnsHoraRegistroTransacao string `xml:"horaRegistroTransacao"`
                }
                XMLAnsOrigem struct {
                    XMLAnsRegistro string `xml:"registroANS"`
                }
                XMLAnsDestino struct {
                    XMLAnsIdentificacaoPrestador struct {
                        XMLAnsCodigoPrestadorNaOperadora string `xml:"codigoPrestadorNaOperadora"`
                }
          }
       }
    }

func main() {

    // variables

        var data XmlTISSIndex   

        buffer := make([]byte,len(str))
        buffer = []byte(str)
        xml.Unmarshal(buffer,&data)
        fmt.Print(data)
        fmt.Println(data.XMLCabecalho.XMLAnsIdentificacaoTransacao.XMLAnsDataRegistroTransacao)
        fmt.Println(data.XMLCabecalho.XMLAnsIdentificacaoTransacao.XMLAnsHoraRegistroTransacao)
        fmt.Println(data.XMLCabecalho.XMLAnsIdentificacaoTransacao.XMLAnsSequenciaTransacao)
        fmt.Println(data.XMLCabecalho.XMLAnsIdentificacaoTransacao.XMLAnstipoTransacao)
}

1 Ответ

0 голосов
/ 01 марта 2020

То, как вы строили свои структуры, было неверным. Кроме того, поскольку вы используете кодировку ISO-8859-1, это немного усложнило ..

Я использовал эту статью для помощи в выяснении этого.

Примерно так должно работать:

package main

import (
    "bytes"
    "encoding/xml"
    "fmt"
    "golang.org/x/net/html/charset" // <-- Had to use this due to ISO-8859-1 encoding
)

// Sample document
var str = `<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
    <mensagem>
        <cabecalho>
            <identificacaoTransacao>
                <tipoTransacao>DESCRICAO</tipoTransacao>
                <sequencialTransacao>5443811</sequencialTransacao>
                <dataRegistroTransacao>2020-02-27</dataRegistroTransacao>
                <horaRegistroTransacao>17:35:11</horaRegistroTransacao>
            </identificacaoTransacao>
            <origem>
                <registroANS>005711</registroANS>
            </origem>
            <destino>
                <identificacaoPrestador>
                    <codigoPrestadorNaOperadora>687146</codigoPrestadorNaOperadora>
                </identificacaoPrestador>
            </destino>
            <Padrao>3.03.03</Padrao>
        </cabecalho>
    </mensagem>`

type IdentificacaoTransacao struct {
    XMLName               xml.Name `xml:"identificacaoTransacao"`
    TipoTransacao         string   `xml:"tipoTransacao"`
    SequencialTransacao   string   `xml:"sequencialTransacao"`
    DataRegistroTransacao string   `xml:"dataRegistroTransacao"`
    HoraRegistroTransacao string   `xml:"horaRegistroTransacao"`
}

type Origem struct {
    XMLName     xml.Name `xml:"origem"`
    RegistroANS string   `xml:"registroANS"`
}

type IdentificacaoPrestador struct {
    XMLName                    xml.Name `xml:"identificacaoPrestador"`
    CodigoPrestadorNaOperadora string   `xml:"codigoPrestadorNaOperadora"`
}

type Destino struct {
    XMLName                xml.Name               `xml:"destino"`
    IdentificacaoPrestador IdentificacaoPrestador `xml:"identificacaoPrestador"`
}

type Cabecalho struct {
    XMLName                xml.Name               `xml:"cabecalho"`
    IdentificacaoTransacao IdentificacaoTransacao `xml:"identificacaoTransacao"`
    Origem                 Origem                 `xml:"origem"`
    Destino                Destino                `xml:"destino"`
    Padrao                 string                 `xml:"Padrao"`
}

type Mensagem struct {
    XMLName   xml.Name  `xml:"mensagem"`
    Cabecalho Cabecalho `xml:"cabecalho"`
}

func main() {
    var mensagem Mensagem
    var err error

    byteStr := []byte(str)

    reader := bytes.NewReader(byteStr)
    decoder := xml.NewDecoder(reader)
    decoder.CharsetReader = charset.NewReaderLabel
    err = decoder.Decode(&mensagem)

    if err != nil {
        fmt.Println("Decoder error:", err)
    }

    fmt.Println(mensagem)
}

Что дает мне следующий вывод:

{{ mensagem} {{ cabecalho} {{ identificacaoTransacao} DESCRICAO 5443811 2020-02-27 17:35:11} {{ origem} 005711} {{ destino} {{ identificacaoPrestador} 687146}} 3.03.03}}
...