page contents

Golang解析xml神器etree

Golang原生的encoding/xml 原生的encoding/xml库中的Unmarshal函数可以解析xml格式的信息 但往往需要我们需要先定义相应的结构体,如果xml结构复杂,我们还需要定义多个结构体。这在解析一...

attachments-2021-07-NGA6pUPg60e9014f60af0.png

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:

attachments-2021-07-ygGtsbcn60e9018d31964.png

其复杂程度可见一斑。

于是我想应该有类似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技术交流群一起交流学习哦。

attachments-2022-06-dlwoNkmU62ad39dbe01d7.jpeg

  • 发表于 2021-07-10 10:13
  • 阅读 ( 1431 )
  • 分类:Golang

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章