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
谢谢!我会试一试,然后回来找你!
祝一切顺利
你好,Yamil,
感谢你的帮助!
我已经有了这个结构体。但我的问题是,我该如何将另一个 API 调用返回的切片插入到
ID []string `xml:"id"`
中?在你贴在这里的示例里,我看到 ID 参数是一个字符串切片 []string。
谢谢,祝一切顺利。
你好,Yamil,
我明白你的意思,但在你的例子中,你是从XML中提取ID,而我的情况是想要将ID插入到XML中。我已经成功运行了unmarshal来获取一些信息。
但为了实现我的目标,我需要构建XML主体,并将我切片中已有的ID添加进去。
可能我没有解释清楚我想要达到的目的。
谢谢。
请访问 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
}


