Golang XML キー名の競合

WBOY
リリース: 2024-02-05 22:03:04
転載
692 人が閲覧しました

Golang xml 键名称冲突

質問の内容

別のシステムに読み込むために、複雑な 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 ドキュメントに余分なレベルが含まれないようにするために使用されます。

ValueStringArray

には、プロジェクトが次のとおりであるため、string を使用します。このように名付けられました。 最後に、再帰 (dict 内部

dict

) を可能にするために、次の構造を定義することもできます: リーリー すべての操作が完了したら、カスタム マーシャラーを実装できます: リーリー これにより、次のようなプロジェクトを生成できるようになります:

リーリー

タグの名前 (ここでは

real

) は、

getXMLName()

メソッドによって返される内容に基づいています。 最後に、次のように Go の構造体とマーシャルを定義できます: リーリー これにより、質問で提供されたサンプル XML の内容が正確に出力されます。

Go プレイグラウンドで完全なコードをテストできます:

https://go.dev/play/p /k8cEIywx3UB

このソリューションの主な利点は次のとおりです:

カスタム XML マーシャラーを実装するだけです

XML ドキュメント内に他の構造がある場合は、簡単に拡張できます (ブール値としましょう。
    ValueBool
  • 実装
  • Value
  • を作成できます)

以上がGolang XML キー名の競合の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート