別のシステムに読み込むために、複雑な XML ファイルを生成する必要があります。したがって、正しくロードするには正確な形式に従う必要があるため、タグとタグの順序は変更できません。私は現在、これを達成するためにgolangのencoding/xmlパッケージを使用しています。
私が抱えている問題は、同じ名前のタグを 2 つ持つことができないことです。次のエラーが発生します: main.XMLDict ラベル「key」のフィールド "Key1" が、ラベル "key" のフィールド "Key2" と競合します。以下は私の簡略化されたコードです:
リーリー生成する必要がある XML ファイルの例は次のとおりです:
リーリーそれで、私の質問: 1) この問題を解決する簡単な方法はありますか。データを構築してから XML を生成するという構造的なアプローチを引き続き使用します。2) このファイルを構築して生成するための、スタッツ または 3) 私が何か間違ったことをしているだけですか?
編集: 以下は要求された入力ファイルです:
import ( "fmt" "encoding/xml" "os" ) type XMLDict struct { XMLName xml.Name `xml:"dict"` Key1 string `xml:"key"` Data1 string `xml:"data"` Key2 string `xml:"key"` StringArray XMLStringArray } type XMLStringArray struct { XMLName xml.Name `xml:"array"̀` XMLString []string `xml:"string"` } func main() { sa := make([]string, 3) sa[0] = "g" sa[1] = "h" sa[2] = "i" arr := XMLStringArray{ XMLString: sa, } master := XMLDict{ Key1: "Color", Data1: "Random data", Key2: "Curve", StringArray: arr, } output, err := xml.MarshalIndent(master, " ", " ") if err != nil { fmt.Printf("error: %v\n", err) } os.Stdout.Write(output) return }
XML カスタム marshaler を使用してこれを実現する解決策はたくさんあると思いますが、これは私の試みです。
まず第一に、ルート <dict>
では、常に次のような項目の「リスト」になっているようです:
これらのそれぞれを表すには、KeyValue
構造体を定義できます。ここで、Value
は、保持できるもの (data
、 # ##整数###、...)###
リーリー
次に、例で提供されているさまざまな型を使用して
Value
XML タグ内で、chardata
は、XML ドキュメントに余分なレベルが含まれないようにするために使用されます。
には、プロジェクトが次のとおりであるため、string
を使用します。このように名付けられました。
最後に、再帰 (dict
内部
) を可能にするために、次の構造を定義することもできます:
リーリー
すべての操作が完了したら、カスタム マーシャラーを実装できます:
リーリー
これにより、次のようなプロジェクトを生成できるようになります:
タグの名前 (ここでは
real) は、
getXMLName() メソッドによって返される内容に基づいています。
最後に、次のように Go の構造体とマーシャルを定義できます:
リーリー
これにより、質問で提供されたサンプル XML の内容が正確に出力されます。
Go プレイグラウンドで完全なコードをテストできます:
https://go.dev/play/p /k8cEIywx3UB。
カスタム XML マーシャラーを実装するだけですXML ドキュメント内に他の構造がある場合は、簡単に拡張できます (ブール値としましょう。
以上がGolang XML キー名の競合の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。