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技术交流群一起交流学习哦。