面试题答案
一键面试- 解析带命名空间的XML:
假设XML文档如下:
Go代码实现解析如下:<root xmlns:ns1="http://example.com/ns1" xmlns:ns2="http://example.com/ns2"> <ns1:element1>value1</ns1:element1> <ns2:element2>value2</ns2:element2> </root>
package main import ( "encoding/xml" "fmt" ) type Root struct { XMLName xml.Name `xml:"root"` Element1 string `xml:"ns1:element1"` Element2 string `xml:"ns2:element2"` } func main() { xmlData := ` <root xmlns:ns1="http://example.com/ns1" xmlns:ns2="http://example.com/ns2"> <ns1:element1>value1</ns1:element1> <ns2:element2>value2</ns2:element2> </root> ` var root Root err := xml.Unmarshal([]byte(xmlData), &root) if err != nil { fmt.Println("Error unmarshaling XML:", err) return } fmt.Printf("Element1: %s\n", root.Element1) fmt.Printf("Element2: %s\n", root.Element2) }
- 将特定结构体编码为带命名空间的XML:
假设我们有如下结构体:
编码代码如下:type MyStruct struct { XMLName xml.Name `xml:"ns1:outer"` Value string `xml:"ns1:inner"` }
package main import ( "encoding/xml" "fmt" ) type MyStruct struct { XMLName xml.Name `xml:"ns1:outer"` Value string `xml:"ns1:inner"` } func main() { myData := MyStruct{ XMLName: xml.Name{Space: "http://example.com/ns1", Local: "outer"}, Value: "some value", } xmlData, err := xml.MarshalIndent(myData, "", " ") if err != nil { fmt.Println("Error marshaling XML:", err) return } xmlHeader := []byte(xml.Header) xmlData = append(xmlHeader, xmlData...) fmt.Println(string(xmlData)) }
在上述代码中,通过xml.Name
的Space
字段指定命名空间,在解析和编码过程中实现对命名空间的处理。在解析时,结构体字段标签中使用ns1:element
这样的形式来匹配XML中的命名空间元素;在编码时,通过设置xml.Name
的Space
来生成带命名空间的XML元素。