ホームページ >バックエンド開発 >Golang >Go の `encoding/xml` パッケージで終了タグを使用せずに XML 要素を生成するにはどうすればよいですか?

Go の `encoding/xml` パッケージで終了タグを使用せずに XML 要素を生成するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-20 04:09:02685ブラウズ

How to Generate XML Elements Without Closing Tags in Go's `encoding/xml` Package?

終了タグを使用しない XML 要素の生成

Go では、encoding/xml パッケージは構造体を XML ドキュメントにマーシャリングするために広く使用されています。ただし、 など、終了タグなしで要素を作成しようとすると、一般的な問題が発生します。

ネストされた要素を含む XML エンベロープを表す次の構造体を考えてみましょう。

type TierRequest struct {
    // ...
    Header string `xml:"soapenv:Header"`
    Body   TierBody `xml:"soapenv:Body"`
}

type TierBody struct {
    GetCollectorProfiles GetCollectorProfile `xml:"typ:GetCollectorProfileRequest"`
}

type GetCollectorProfile struct {
    Contexts CollectorContext `xml:"typ:Context"`
    Number   int              `xml:"typ:CollectorNumber"`
}

type CollectorContext struct {
    Channel  string `xml:"Channel,attr"`
    Source   string `xml:"Source,attr"`
    Language string `xml:"LanguageCode,attr"`
}

この構造体をマーシャリングすると、結果の XML ドキュメントには の両方の終了タグが含まれます。および :

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                  xmlns:typ="http:/www.yahoo.com/tp/ets/2008/04/01/collector/types">
  <soapenv:Header></soapenv:Header>
  <soapenv:Body>
    <GetCollectorProfiles>
      <typ:Context Channel="WEB" Source="WEB" LanguageCode="en-CA"></typ:Context>
      <typ:CollectorNumber>50000</typ:CollectorNumber>
    </GetCollectorProfiles>
  </soapenv:Body>
</soapenv:Envelope>

終了タグを削除するには、XML の原則を理解することが不可欠です。 XML では、コンテンツのない要素は、空の要素タグ (例: ) または終了タグ付きの要素 (例: ) として表すことができます。 。これら 2 つの形式の選択は、encoding/xml パッケージによって制御されます。

ドキュメントによると、encoding/xml パッケージは、属性を持つ要素には終了タグを使用し、属性のない要素には空の要素タグを使用します。両方の があるため、

一貫性を保つために空の要素タグを使用する方が望ましいように思えるかもしれませんが、XML の有効性という点では 2 つの形式の間に機能的な違いはありません。どちらの方法でも、XML 仕様に準拠した同等の XML ドキュメントが生成されます。

したがって、属性を持つ要素に対して空の要素タグを使用するようにエンコーディング/xml パッケージに強制することはお勧めできません。代わりに、パッケージの標準動作に従って、これらの要素が終了タグ付きでレンダリングされるという事実を受け入れてください。

以上がGo の `encoding/xml` パッケージで終了タグを使用せずに XML 要素を生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。