xml - 用多个带前缀的 namespace 构造XML信封

标签 xml go xml-parsing

如何为xml.Name类型添加多个值?

// Envelope type
type Envelope struct {
    XMLName xml.Name `xml:"http://schemas.xmlsoap.org/soap/envelope/ SOAP-ENV:Envelope"`    
    Header  Header
    Body    Body
}
XML信封的预期结果
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:login"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
第一个代码的电流输出如下:
 <SOAP-ENV:Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">

最佳答案

在标准库中,当编码XML时,对 namespace 前缀的支持似乎是work in progress
使用 xml.Marshal 获得所需输出的一种方法是在string结构中使用...,attr标记声明Envelope字段:

a field with tag "name,attr" becomes an attribute with the given name in the XML element.

// Envelope type
type Envelope struct {
    XMLName      xml.Name `xml:"SOAP-ENV:Envelope"`
    XmlNSSoapEnv string   `xml:"xmlns:SOAP-ENV,attr"`
    XmlNSUrn     string   `xml:"xmlns:urn,attr"`
    XmlNSXsd     string   `xml:"xmlns:xsd,attr"`
    XmlNSXsi     string   `xml:"xmlns:xsi,attr"`
    Header       Header
    Body         Body
}
然后,在初始化Envelope结构时,将所需的字符串值分配给这些字段:
func main() {
    e := &Envelope{
        XmlNSSoapEnv: "http://schemas.xmlsoap.org/soap/envelope/",
        XmlNSUrn:     "urn:login",
        XmlNSXsd:     "http://www.w3.org/2001/XMLSchema",
        XmlNSXsi:     "http://www.w3.org/2001/XMLSchema-instance",
    }

    a, err := xml.MarshalIndent(e, "", "\t")
    if err != nil {
        panic(err)
    }
    fmt.Println(string(a))
}
这个outputs:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:login" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Header></Header>
    <Body></Body>
</SOAP-ENV:Envelope>

关于xml - 用多个带前缀的 namespace 构造XML信封,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62970734/

相关文章:

c - 保存简单的 XML 文件

android - 布局中的一半 ImageView

c# - 如何在 C# 中将原始 XML 转换为 SOAP XML?

mongodb - Golang MongoDB 错误 : result argument must be a slice address

python - 控制搜索深度 findall Lxml

java - 如何使用 Java 从 XML 中读取值并将其保存在 Hashmap 中

php - php中的SimpleXML设置xml验证限制

golang udp客户端无法从服务器接收消息

json - 为什么 go 将 JSON 视为 []byte 而不是字符串?

java - 使用 XStream 解析 - 空标签和集合