2016-06-30 13 views
7

私は、次の構造体からXMLを書いている:Go、encoding/xml:自己クローズ要素をどのようにマーシャリングできますか?

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"` 
} 

Refフィールドが空の場合、私は表示する要素を好きですが、自動閉鎖だろう、すなわち

<Ref /> 

ない

<Ref></Ref> 

私の知る限り、これら二つは意味的に等価ですが、私は自己CLを好むだろうそれは他のシステムからの出力と一致するので、osingタグ。これは可能ですか?

+4

を。私はゴランがあなたが求めていることを支持しているのか疑いがあります。 https://groups.google.com/forum/#!topic/golang-nuts/guG6iOCRu08 –

+1

できません。 (まあ、ちょうど 'sを除いて、、g'。) – Volker

答えて

1

マーシャルパッケージを「ハッキングする」方法を見つけましたが、テストしませんでした。あなたに私にあなたにリンクを見せたいなら、今私に言いなさい、そして、私はこの返答のコメントにそれを掲示する。

私はいくつかの手動でのコードでした:私はこの `行く-nuts`スレッドが同じことを議論だと思う

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) 
    } 
} 
関連する問題