1

本当に明らかな何かが欠けているに違いありません...ExampleUnmarshal()ここの例に従って、単純なXMLファイルを解析しようとしています: http://golang.org/src/pkg/encoding/xml/example_test.go

これの下部にあるように、属性または子要素のいずれもマッピングされていません (方向 - マーシャルまたはアンマーシャル)。私が言えることから、これは上記の example_test.go で行っていることとほぼ同じです (私が見ることができる唯一の違いは、そのテストの型が関数の範囲内にあるということです-私が試したところ、違いはありません。そして、それらは属性ではなく子要素を使用しています-ただし、ドキュメントid名ごとに、属性はうまくいくはずです)。

コードは次のようになります。

package main

import (
    "fmt"
    "encoding/xml"
    "io/ioutil"
)


type String struct {
    XMLName xml.Name `xml:"STRING"`
    lang  string   `xml:"lang,attr"`
    value  string   `xml:"value,attr"`
}

type Entry struct {
    XMLName xml.Name `xml:"ENTRY"`
    id      string  `xml:"id,attr"`
    strings []String 
}

type Dictionary struct {
    XMLName xml.Name `xml:"DICTIONARY"`
    thetype  string   `xml:"type,attr"`
    ignore  string   `xml:"ignore,attr"`
    entries []Entry  
}

func main() {

    dict := Dictionary{}

    b := []byte(`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DICTIONARY type="multilanguage" ignore="en">
  <ENTRY id="ActionText.Description.AI_ConfigureChainer">
    <STRING lang="en" value="ActionText.Description.AI_ConfigureChainer"/>
    <STRING lang="da" value=""/>
    <STRING lang="nl" value=""/>
    <STRING lang="fi" value=""/>
  </ENTRY>
</DICTIONARY>
`)

    err := xml.Unmarshal(b, &dict)
    if err != nil { panic(err) }

    fmt.Println(dict) // prints: {{ DICTIONARY}   []}

    dict.ignore = "test"

    out, err := xml.MarshalIndent(&dict, "  ", "    ")
    fmt.Println(string(out)) // prints:   <DICTIONARY></DICTIONARY>

    // huh?

}
4

1 に答える 1

6

構造体フィールドをエクスポート(大文字化)する必要があります。

encoding/xml Marshall関数ドキュメントから:

構造体の XML 要素には、構造体のエクスポートされたフィールドごとにマーシャリングされた要素が含まれています。

関連する回答については、golang で複雑な json を解析できないを参照してください。

于 2013-09-30T10:28:33.460 に答える