Golang原生的encoding/xml
原生的encoding/xml库中的Unmarshal函数可以解析xml格式的信息
但往往需要我们需要先定义相应的结构体,如果xml结构复杂,我们还需要定义多个结构体。这在解析一些多层嵌套xml中显得非常被动
例:
<?xml version="1.0" encoding="utf-8"?>
<Weblogic version="12.1.0.1">
<servers>
<server>
<serverName>AdminServer</serverName>
<serverIP>10.1.0.10</serverIP>
</server>
<server>
<serverName>App</serverName>
<serverIP>10.1.0.11</serverIP>
</server>
</servers>
</Weblogic>
type Recurlyservers struct {
XMLName xml.Name `xml:"Weblogic"`
Version string `xml:"version,attr"`
Svs []server `xml:"server"`
Description string `xml:",innerxml"`
}
type server struct {
XMLName xml.Name `xml:"server"`
ServerName string `xml:"serverName"`
ServerIP string `xml:"serverIP"`
}
func main() {
file, err := os.Open("servers.xml") // For read access.
if err != nil {
fmt.Printf("error: %v", err)
return
}
defer file.Close()
data, err := ioutil.ReadAll(file)
if err != nil {
fmt.Printf("error: %v", err)
return
}
v := Recurlyservers{}
err = xml.Unmarshal(data, &v)
if err != nil {
fmt.Printf("error: %v", err)
return
}
fmt.Println(v)
}
像上面这样结构较为简单的还好,但遇到像下面这种(WAS RESTApi)返回信息
<PerformanceMonitor responseStatus="success" version="8.5.5.0">
<Node name="db1Node01">
<Server name="nodeagent">
<Stat name="server">
<Stat name="DCS Statistics">
<Stat name="DefaultCoreGroup"/>
</Stat>
<Stat name="Security Authentication">
<CountStatistic ID="1" count="0" lastSampleTime="1542195418071" name="WebAuthenticationCount" startTime="1542195418071" unit="None"/>
<CountStatistic ID="3" count="0" lastSampleTime="1542195418071" name="IdentityAssertionCount" startTime="1542195418071" unit="None"/>
<CountStatistic ID="4" count="0" lastSampleTime="1542195418071" name="BasicAuthenticationCount" startTime="1542195418071" unit="None"/>
<CountStatistic ID="5" count="0" lastSampleTime="1542195418071" name="TokenAuthenticationCount" startTime="1542195418071" unit="None"/>
<CountStatistic ID="6" count="0" lastSampleTime="1542195418071" name="JAASIdentityAssertionCount" startTime="1542195418071" unit="None"/>
<CountStatistic ID="7" count="0" lastSampleTime="1542195418071" name="JAASBasicAuthenticationCount" startTime="1542195418071" unit="None"/>
...
xml view:
其复杂程度可见一斑。
于是我想应该有类似gabs解析JSON串那样灵活的轮子
果然github上有这么一个还算不错的轮子 etree
可以动态解析xml,拿到你想要的结果,而且不需要定义相应的结构体。
让我们回到第一个例子里面
我们需要拿到weblogic中的第一个服务器的服务器名:
func main() {
// 初始化根节点
doc := etree.NewDocument()
if err := doc.ReadFromFile("node.xml"); err != nil {
panic(err)
}
root := doc.SelectElement("Weblogic")
res := root.FindElement("./server[0]/serverName").Text()
fmt.Println(res)
}
FindElement(“支持X-path”)
官方demo:
doc := etree.NewDocument()
if err := doc.ReadFromFile("test.xml"); err != nil {
panic(err)
}
root := doc.SelectElement("Weblogic") // 首先获取最外层作为根节点
更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。
程序员编程交流QQ群:805358732
如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!