为了账号安全,请及时绑定邮箱和手机立即绑定

如何在golang中修改xml并仅返回没有包装器的内容

如何在golang中修改xml并仅返回没有包装器的内容

Go
开心每一天1111 2023-02-21 16:09:06
我有一个这样的 XML 文件<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.opentravel.org/OTA/2003/05">    <soap:Header/>    <soap:Body>        <contents>            <article>                <category>Server</category>                <title>Connect to Oracle Server using Golang and Go-OCI8 on Ubuntu</title>                <url>/go-oci8-oracle-linux/</url>            </article>            <article>                <category>Server</category>                <title>Easy Setup OpenVPN Using Docker DockVPN</title>                <url>/easy-setup-openvpn-docker/</url>            </article>            <article info="popular article">                <category>Server</category>                <title>Setup Ghost v0.11-LTS, Ubuntu, Nginx, Custom Domain, and SSL</title>                <url>/ghost-v011-lts-ubuntu-nginx-custom-domain-ssl/</url>            </article>        </contents>    </soap:Body></soap:Envelope>我想修改它只返回这样<?xml version="1.0" encoding="UTF-8"?> <contents>    <article>        <category>Server</category>        <title>Connect to Oracle Server using Golang and Go-OCI8 on Ubuntu</title>        <url>/go-oci8-oracle-linux/</url>    </article>    <article>        <category>Server</category>        <title>Easy Setup OpenVPN Using Docker DockVPN</title>        <url>/easy-setup-openvpn-docker/</url>    </article>    <article info="popular article">        <category>Server</category>        <title>Setup Ghost v0.11-LTS, Ubuntu, Nginx, Custom Domain, and SSL</title>        <url>/ghost-v011-lts-ubuntu-nginx-custom-domain-ssl/</url>    </article></contents>所以我想删除包装器并只选择soap:Body 一些使用 etree 的解决方案(https://pkg.go.dev/github.com/beevik/etree#Element)?===========================================================
查看完整描述

1 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

标准库足以完成这项任务。简单地解析 XML 文档,使用xml:",innerxml"Body 元素在其中使用任意 XML。然后你可以把它吐出来。


package main


import (

    "bytes"

    "encoding/xml"

    "io"

    "log"

    "os"

)


var src = []byte(`

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.opentravel.org/OTA/2003/05">

    <soap:Header/>

    <soap:Body>

        <contents>

            <article>

                <category>Server</category>

                <title>Connect to Oracle Server using Golang and Go-OCI8 on Ubuntu</title>

                <url>/go-oci8-oracle-linux/</url>

            </article>

            <!-- ... -->

        </contents>

    </soap:Body>

</soap:Envelope>

`)


type envelope struct {

    XMLName xml.Name `xml:"Envelope"`

    Body    struct {

        InnerXML []byte `xml:",innerxml"`

    }

}


func main() {

    var e envelope

    if err := xml.Unmarshal(src, &e); err != nil {

        log.Fatal(err)

    }


    io.WriteString(os.Stdout, xml.Header)

    os.Stdout.Write(bytes.TrimSpace(e.Body.InnerXML))

}

在操场上试试:https://go.dev/play/p/CUEpuPfh_Xl


查看完整回答
反对 回复 2023-02-21
  • 1 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信