MST
星途 面试题库

面试题:Go中xml包处理命名空间:复杂结构

假设你有一个多层嵌套且包含多个不同命名空间的XML文档,如下:`<outer xmlns:ns1='http://ns1.com'><ns1:middle xmlns:ns2='http://ns2.com'><ns2:inner>data</ns2:inner></ns1:middle></outer>`。要求编写Go代码实现解析该XML到结构体,同时确保命名空间的正确映射,并且在解析后能够将结构体重新序列化为与原XML相同格式(包含命名空间声明)的XML字符串。
45.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "encoding/xml"
    "fmt"
)

// 定义结构体,注意标签中指定命名空间
type Outer struct {
    XMLName xml.Name `xml:"outer"`
    Middle  Middle   `xml:"ns1:middle"`
}

type Middle struct {
    XMLName xml.Name `xml:"ns1:middle"`
    Inner   Inner    `xml:"ns2:inner"`
}

type Inner struct {
    XMLName xml.Name `xml:"ns2:inner"`
    Data    string   `xml:",chardata"`
}

func main() {
    xmlData := `<outer xmlns:ns1='http://ns1.com'><ns1:middle xmlns:ns2='http://ns2.com'><ns2:inner>data</ns2:inner></ns1:middle></outer>`
    var outer Outer
    err := xml.Unmarshal([]byte(xmlData), &outer)
    if err != nil {
        fmt.Println("解析XML出错:", err)
        return
    }

    newXMLData, err := xml.MarshalIndent(outer, "", "  ")
    if err != nil {
        fmt.Println("序列化XML出错:", err)
        return
    }
    // 添加XML声明头
    newXMLData = append([]byte(xml.Header), newXMLData...) 
    fmt.Println(string(newXMLData))
}