2016-06-30 17 views
7

Tôi đang viết XML từ các cấu trúc sau:Go, encoding/xml: Làm thế nào tôi có thể sắp xếp các yếu tố tự đóng?

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

Nếu trường Ref là trống rỗng, tôi muốn phần tử để hiển thị, nhưng phải tự đóng, tức là

<Ref /> 

không:

<Ref></Ref> 

AFAIK, hai là ngữ nghĩa tương đương, nhưng tôi muốn tự cl osing tag, vì nó khớp với đầu ra từ các hệ thống khác. Điều này có thể không?

+4

Tôi nghĩ rằng đây 'chủ đề go-nuts' thảo luận về điều tương tự. Tôi có nghi ngờ golang có hỗ trợ của những gì bạn đang yêu cầu. https://groups.google.com/forum/#!topic/golang-nuts/guG6iOCRu08 –

+1

Bạn không thể. (Vâng, ngoại trừ chỉ 's, , , g'.) – Volker

Trả lời

1

Tôi đã tìm ra cách để thực hiện gói "soái" nguyên soái, nhưng tôi không thử nghiệm. Nếu bạn muốn tôi cho bạn thấy liên kết, hãy cho tôi ngay bây giờ, sau đó tôi đăng nó trong các bình luận của câu trả lời này.

tôi đã làm một số bằng tay mã:

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) 
    } 
} 
Các vấn đề liên quan