Golang如何利用切片数据添加XML元素

Golang如何利用切片数据添加XML元素 我正在编写一个简单的程序,用于执行一些XML API调用。在其中一次调用中,我获取到的数据存储在一个切片中,其中包含ID。我的下一步是将这些ID放入XML主体中,并进行另一次API调用。

通常,我会发送如下的XML主体:

<packet>
<customer>
     <get-domain-list>
          <filter>
 <id>138</id>
          </filter>
     </get-domain-list>
</customer>
</packet>

但在我的情况下,我希望插入多个<id>标签,包含我切片中存储的所有ID。例如:

<packet>
<customer>
     <get-domain-list>
          <filter>
 <id>138</id>
 <id>139</id>
 <id>140</id>
 <id>141</id>
          </filter>
     </get-domain-list>
</customer>
</packet>

那么,我想知道如何创建XML主体并插入我切片中的内容?

非常感谢。


更多关于Golang如何利用切片数据添加XML元素的实战教程也可以访问 https://www.itying.com/category-94-b0.html

8 回复

希望这能有所帮助!!!

更多关于Golang如何利用切片数据添加XML元素的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


谢谢!我会试一试,然后回来找你!

祝一切顺利

你好,Yamil,

感谢你的帮助!

我已经有了这个结构体。但我的问题是,我该如何将另一个 API 调用返回的切片插入到

				ID   []string `xml:"id"`

中?在你贴在这里的示例里,我看到 ID 参数是一个字符串切片 []string

谢谢,祝一切顺利。

你好,Yamil,

我明白你的意思,但在你的例子中,你是从XML中提取ID,而我的情况是想要将ID插入到XML中。我已经成功运行了unmarshal来获取一些信息。

但为了实现我的目标,我需要构建XML主体,并将我切片中已有的ID添加进去。

可能我没有解释清楚我想要达到的目的。

谢谢。

只需将相应字段创建为切片

packet.Customer.GetDomainList .Filter.ID =  make([]string, 2)
 packet.Customer.GetDomainList .Filter.ID  = append(packet.Customer.GetDomainList .Filter.ID , "10001")
 packet.Customer.GetDomainList .Filter.ID  = append(packet.Customer.GetDomainList .Filter.ID , "10002")

请访问 https://www.onlinetool.io/xmltogo/ 只需粘贴您的XML,该应用程序就会生成其对应的Go语言结构体。

type Packet struct {
	XMLName  xml.Name `xml:"packet"`
	Text     string   `xml:",chardata"`
	Customer struct {
		Text          string `xml:",chardata"`
		GetDomainList struct {
			Text   string `xml:",chardata"`
			Filter struct {
				Text string   `xml:",chardata"`
				ID   []string `xml:"id"`
			} `xml:"filter"`
		} `xml:"get-domain-list"`
	} `xml:"customer"`
}

要访问ID切片,你可以使用如下代码:

package main

import (
	"fmt"
	"encoding/xml"
)

type Packet struct {
	XMLName  xml.Name `xml:"packet"`
	Text     string   `xml:",chardata"`
	Customer struct {
		Text          string `xml:",chardata"`
		GetDomainList struct {
			Text   string `xml:",chardata"`
			Filter struct {
				Text string   `xml:",chardata"`
				ID   []string `xml:"id"`
			} `xml:"filter"`
		} `xml:"get-domain-list"`
	} `xml:"customer"`
}

func main() {
   rawXmlData := "<packet><customer><get-domain-list><filter> <id>138</id><id>139</id><id>140</id><id>141</id></filter></get-domain-list></customer></packet>";
var packet Packet 
    xml.Unmarshal([]byte(rawXmlData), &packet)

fmt.Println(packet.Customer.GetDomainList .Filter.ID)
}

可以使用 encoding/xml 包来动态生成包含切片数据的XML。以下是示例代码:

package main

import (
    "encoding/xml"
    "fmt"
    "strings"
)

type Filter struct {
    XMLName xml.Name `xml:"filter"`
    IDs     []ID     `xml:"id"`
}

type ID struct {
    Value int `xml:",chardata"`
}

type GetDomainList struct {
    XMLName xml.Name `xml:"get-domain-list"`
    Filter  Filter   `xml:"filter"`
}

type Customer struct {
    XMLName      xml.Name      `xml:"customer"`
    GetDomainList GetDomainList `xml:"get-domain-list"`
}

type Packet struct {
    XMLName  xml.Name `xml:"packet"`
    Customer Customer `xml:"customer"`
}

func main() {
    // 示例切片数据
    ids := []int{138, 139, 140, 141}
    
    // 将切片转换为ID结构体切片
    idStructs := make([]ID, len(ids))
    for i, id := range ids {
        idStructs[i] = ID{Value: id}
    }
    
    // 构建XML结构
    packet := Packet{
        Customer: Customer{
            GetDomainList: GetDomainList{
                Filter: Filter{
                    IDs: idStructs,
                },
            },
        },
    }
    
    // 生成XML
    output, err := xml.MarshalIndent(packet, "", "    ")
    if err != nil {
        panic(err)
    }
    
    // 添加XML头部
    xmlStr := xml.Header + string(output)
    fmt.Println(xmlStr)
    
    // 或者直接使用Marshal获取紧凑格式
    compactOutput, _ := xml.Marshal(packet)
    fmt.Println(string(compactOutput))
}

如果需要更灵活的控制,可以使用 strings.Builder 手动构建:

package main

import (
    "fmt"
    "strings"
)

func buildXML(ids []int) string {
    var sb strings.Builder
    
    sb.WriteString(`<?xml version="1.0" encoding="UTF-8"?>`)
    sb.WriteString("\n<packet>\n")
    sb.WriteString("  <customer>\n")
    sb.WriteString("    <get-domain-list>\n")
    sb.WriteString("      <filter>\n")
    
    for _, id := range ids {
        sb.WriteString(fmt.Sprintf("        <id>%d</id>\n", id))
    }
    
    sb.WriteString("      </filter>\n")
    sb.WriteString("    </get-domain-list>\n")
    sb.WriteString("  </customer>\n")
    sb.WriteString("</packet>")
    
    return sb.String()
}

func main() {
    ids := []int{138, 139, 140, 141}
    xmlBody := buildXML(ids)
    fmt.Println(xmlBody)
}

对于API调用,可以直接使用生成的XML字符串作为请求体:

package main

import (
    "bytes"
    "encoding/xml"
    "net/http"
)

func sendRequest(ids []int) error {
    packet := Packet{
        Customer: Customer{
            GetDomainList: GetDomainList{
                Filter: Filter{
                    IDs: func() []ID {
                        idStructs := make([]ID, len(ids))
                        for i, id := range ids {
                            idStructs[i] = ID{Value: id}
                        }
                        return idStructs
                    }(),
                },
            },
        },
    }
    
    xmlData, err := xml.Marshal(packet)
    if err != nil {
        return err
    }
    
    req, err := http.NewRequest("POST", "https://api.example.com", 
        bytes.NewBuffer(xmlData))
    if err != nil {
        return err
    }
    
    req.Header.Set("Content-Type", "application/xml")
    
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        return err
    }
    defer resp.Body.Close()
    
    return nil
}
回到顶部