xml - Goの要素の任意のXML属性をマーシャルしますか?

xml go

実行時に要素の追加属性をマーシャリングする必要があります。私はこれを試しました:

type Meh struct {
    XMLName xml.Name
    Attrs []xml.Attr
}

Meh{
    Attrs: []xml.Attr{
        xml.Attr{xml.Name{Local: "hi"}, "there"},
    },  
}


しかし、フィールドは新しい要素として扱われます:

<Meh><Attrs><Name></Name><Value>there</Value></Attrs></Meh>


xml:",attr"タグをAttrフィールドに追加すると、単一の属性の内容を指定する[]byteまたはstringが必要になります。

実行時に属性を指定するにはどうすればよいですか?これにフィールドを提供するためにタイプに注釈を付けるにはどうすればよいですか?
答え
テンプレートを直接操作してみてください。例:

package main

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

type ele struct {
    Name  string
    Attrs []attr
}

type attr struct {
    Name, Value string
}

var x = `<{{.Name}}{{range $a := .Attrs}} {{$a.Name}}="{{xml $a.Value}}"{{end}}>
</{{.Name}}>`

func main() {
    // template function "xml" defined here does basic escaping,
    // important for handling special characters such as ".
    t := template.New("").Funcs(template.FuncMap{"xml": func(s string) string {
        var b bytes.Buffer
        xml.Escape(&b, []byte(s))
        return b.String()
    }})
    template.Must(t.Parse(x))
    e := ele{
        Name: "Meh",
        Attrs: []attr{
            {"hi", "there"},
            {"um", `I said "hello?"`},
        },
    }
    b := new(bytes.Buffer)
    err := t.Execute(b, e)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(b)
}


出力:

<Meh hi="there" um="I said &#34;hello?&#34;">
</Meh>
関連記事

xml - xmlschema形式

sql - XSD、XMLからSQLへのインポートに関する問題-この場所ではテキストノードを使用できません

xml - 属性のXML検証が失敗する

c# - XDocument。 Linq to XML。データ数は常にゼロであり、場合によっては間違った結果が返される[重複]

xml - リストボックスに追加するXMLファイル全体から特定のタグを取得するにはどうすればよいですか?

xml - このXMLヘッダータグが無効なのはなぜですか?

c# - SOAPメッセージ応答ASP.NET MVC4 C#を読み取る

xml - XSLTを使用して名前空間でXML要素を反復処理する

xml - XSLT-変数に文字列を追加して別のファイルに出力する

jquery - XMLのDOMオブジェクトからHTMLへ