【问题标题】:XML unmarshalling in GolangGolang 中的 XML 解组
【发布时间】:2022-07-22 19:48:12
【问题描述】:

我想将下面的 xml 有效负载解组为结构

<linearPackagePublish>
                <linearPackage>
                    <name>ABC</name>
                    <packagedServiceReference>
                        <availabilityWindowEnd>2329-12-31 23:59:59</availabilityWindowEnd>
                        <availabilityWindowStart>2007-11-14 11:40:00</availabilityWindowStart>
                        <packagedServiceId>1111111111</packagedServiceId>
                    </packagedServiceReference>
                    <partnerPackageId>XXXXXXX</partnerPackageId>
                </linearPackage>
                <partnerId>XXXXXX</partnerId>
                <wantLinearPublishResult>true</wantLinearPublishResult>
            </linearPackagePublish>

我想在标签之前添加 transactionId,如下所示:

<linearPackagePublish>
                <linearPackage>
                    <name>ABC</name>
                    <packagedServiceReference>
                        <availabilityWindowEnd>2329-12-31 23:59:59</availabilityWindowEnd>
                        <availabilityWindowStart>2007-11-14 11:40:00</availabilityWindowStart>
                        <packagedServiceId>1111111111</packagedServiceId>
                    </packagedServiceReference>
                    <partnerPackageId>XXXXXXX</partnerPackageId>
                </linearPackage>
                <partnerId>XXXXXX</partnerId>
        <transactionId>111111111111</transactionId>
                <wantLinearPublishResult>true</wantLinearPublishResult>
            </linearPackagePublish>

为此,我试图将上面的 xml 解组为下面的结构:

type linearPackagePublish struct {
    LinearPackage           string `xml:"linearPackage"`
    MsoPartnerID            string `xml:"partnerId"`
    TransactionID           string `xml:"transactionId,omitempty"`
    WantLinearPublishResult bool   `xml:"wantLinearPublishResult,omitempty"`
}

但问题是我不想解组 linearPackage 元素,这就是为什么我将 LinearPackage 作为字符串放在 struct 中的原因

我也可以通过正则表达式来实现,但如果 xml 发生变化,它会更容易出错。

有什么方法可以将一些嵌套的 xml 元素做成字符串??

【问题讨论】:

  • 这将有助于制作一个可运行的示例,可能带有指向操场的链接。
  • 你不应该把 LinearPackage 作为字符串,而是使用 LinearPackage xml.CharData xml:"linearPackage" 如果你提供一些你想要的 cmets 和最终结果的代码示例会更好

标签: go


【解决方案1】:

已编辑以提供更多详细信息。包括Go Playground上的工作演示

您可以定义自定义类型,而不是尝试使用字符串,并定义其自己的 marshal 和 unmarshal 函数。这样您就可以直接控制该元素。

您可以看到自定义数据类型包含一个 xml.Tokens 数组。该数组在解组期间填充,然后在编组期间写入编码器。

type skipUnmarshal struct {
    data []xml.Token
}

func (s skipUnmarshal) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
    for i := 0; i < len(s.data); i++ {
        e.EncodeToken(s.data[i])
    }
    return nil
}
func (s *skipUnmarshal) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
    for {
        t, err := d.Token()
        if err != nil {
            break // or alternatively return the error
        }
        s.data = append(s.data, t)
    }
    return nil
}

【讨论】:

  • 其实我是golang新手,能不能详细点。
  • @vikashsingh 确定 - 查看要发布的编辑
猜你喜欢
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多