Как преобразовать строку в XML, используя Golang - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть XML в строковом формате, может ли кто-нибудь помочь мне преобразовать строку XML в правильный формат XML? Заранее спасибо.

package main

import "fmt"

func main() {

    message := `<?xml proflie ><test> value '123'</test>`
    fmt.Printf("%s", message)
}

1 Ответ

1 голос
/ 01 апреля 2020

Используйте пакет encoding/xml с функцией EscapeText:

package main

import (
    "bytes"
    "encoding/xml"
    "fmt"
)

func Xml(in string) string {
    var b bytes.Buffer
    xml.EscapeText(&b, []byte(in))
    return b.String()
}

func main() {
    fmt.Println(`<?xml profile><test>` + Xml(`test '123'`) + `</test>`)
}

Это даст выход: test &#39;123&#39;

Go имеет отличную поддержку XML в encoding/xml, и есть другие способы создания выходных данных, которые не требуют ручного конструирования XML.

Эта версия выполняет перенос в элемент <test>, а также позволяет передавать interface{} для EncodeElement метода, так что вы не ограничены строками:

package main

import (
    "encoding/xml"
    "os"
)

func main() {
    s := `test '123'`
    test := xml.StartElement{Name:xml.Name{Local:`test`}}
    xml.NewEncoder(os.Stdout).EncodeElement(s, test)
}

Наконец, и, вероятно, лучше всего, эта версия использует stuct и .Encode метод :

package main

import (
    "encoding/xml"
    "os"
)

type Test struct {
    XMLName xml.Name `xml:"test"`
    Content string `xml:",chardata"`
}
func main() {
    s := Test{Content:`test '123'`}
    xml.NewEncoder(os.Stdout).Encode(&s)
}

Теперь вы можете расширить структуру, но, что лучше всего, вы также можете Unmarshal или Decode этого типа, чтобы извлечь данные из входящих XML:

package main

import (
    "bytes"
    "encoding/xml"
    "fmt"
)

type Test struct {
    XMLName xml.Name `xml:"test"`
    Content string `xml:",chardata"`
}

func main() {
    s := Test{Content:`test '123'`}
    var buf bytes.Buffer
    xml.NewEncoder(&buf).Encode(&s)
    fmt.Println("Encoded =", buf.String())

    var read Test
    xml.NewDecoder(bytes.NewReader(buf.Bytes())).Decode(&read)
    fmt.Println("Content =", read.Content)
}

См. Документацию по xml.Marshal для полного описания тегов, поддерживаемых пакетом xml: https://golang.org/pkg/encoding/xml/#Marshal

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...