2016-06-30 3 views
7

Ich schreibe XML aus der folgenden Struktur:Go, encoding/xml: Wie kann ich selbstschließende Elemente marshalieren?

type OrderLine struct { 
    LineNumber  string `xml:"LineNumber"` 
    Product  string `xml:"Product"` 
    Ref   string `xml:"Ref"` 
    Quantity  string `xml:"Quantity"` 
    Price   string `xml:"Price"` 
    LineTotalGross string `xml:"LineTotalGross"` 
} 

Wenn das Ref Feld leer ist, würde ich das Element mag, angezeigt werden aber selbstschließend sein, dh

<Ref /> 

und nicht:

<Ref></Ref> 

AFAIK, sind diese zwei semantisch äquivalent, aber ich würde einen Selbst cl bevorzugen tag, wie es mit der Ausgabe von anderen Systemen übereinstimmt. Ist das möglich?

+4

Ich denke, das 'Go-nuts' Faden gleiche Sache diskutiert. Ich habe Zweifel, dass Golang Unterstützung von dem hat, was du fragst. https://groups.google.com/forum/#!topic/golang-nuts/guG6iOCRu08 –

+1

Sie können nicht. (Nun, außer einfach 's, , , g'.) – Volker

Antwort

1

Ich fand einen Weg, es zu tun "hacking" Marshall-Paket, aber ich habe es nicht getestet. Wenn Sie möchten, dass ich Ihnen den Link zeige, lassen Sie mich jetzt, dann poste ich es in Kommentaren dieser Antwort.

Ich habe einige manuell Code:

package main 

import (
    "encoding/xml" 
    "fmt" 
    "regexp" 
    "strings" 
) 

type ParseXML struct { 
    Person struct { 
     Name  string `xml:"Name"` 
     LastName string `xml:"LastName"` 
     Test  string `xml:"Abc"` 
    } `xml:"Person"` 
} 

func main() { 

    var err error 
    var newPerson ParseXML 

    newPerson.Person.Name = "Boot" 
    newPerson.Person.LastName = "Testing" 

    var bXml []byte 
    var sXml string 
    bXml, err = xml.Marshal(newPerson) 
    checkErr(err) 

    sXml = string(bXml) 

    r, err := regexp.Compile(`<([a-zA-Z0-9]*)><(\\|\/)([a-zA-Z0-9]*)>`) 
    checkErr(err) 
    matches := r.FindAllString(sXml, -1) 

    fmt.Println(sXml) 

    if len(matches) > 0 { 
     r, err = regexp.Compile("<([a-zA-Z0-9]*)>") 
     for i := 0; i < len(matches); i++ { 

      xmlTag := r.FindString(matches[i]) 
      xmlTag = strings.Replace(xmlTag, "<", "", -1) 
      xmlTag = strings.Replace(xmlTag, ">", "", -1) 
      sXml = strings.Replace(sXml, matches[i], "<"+xmlTag+" />", -1) 

     } 
    } 

    fmt.Println("") 
    fmt.Println(sXml) 

} 

func checkErr(chk error) { 
    if chk != nil { 
     panic(chk) 
    } 
} 
Verwandte Themen