golang 解析XML

用adb操控android手机时,可以解析页面控件信息(xml)

代码如下:

package main

import (
    "encoding/xml"
    "fmt"
    "io/ioutil"
    "os"
    "os/exec"
)

func main() {

    AdbShellUiautomatorDump()
    DecodeXML()
}

/*
//adb shell uiautomator dump /sdcard/ui.xml
获取当前应用屏幕上所有控件的信息并保存在sdcard下ui.xml文件里面. sdk版本16以上
然后可以在电脑上解析该XML,根据其中的bounds找到控件坐标点,然后tap
可参考:
//https://blog.csdn.net/henni_719/article/details/72953251
//https://studygolang.com/articles/5328
*/
func AdbShellUiautomatorDump() {
    exec.Command("adb", "shell", "uiautomator", "dump", "--compressed", "/sdcard/window_dump.xml").Run()
    exec.Command("adb", "pull", "/sdcard/window_dump.xml", ".").Run()
    exec.Command("adb", "shell", "rm", "/sdcard/window_dump.xml").Run()
}

type HierarchyItem struct {
    XMLName xml.Name   `xml:"hierarchy"`
    Node    []NodeItem `xml:"node"`
    //Description string   `xml:",innerxml"`
}

//嵌套了自身,参考:https://studygolang.com/articles/3670
type NodeItem struct {
    XMLName     xml.Name   `xml:"node"`
    Node        []NodeItem `xml:"node"`
    Bounds      string     `xml:"bounds,attr"`
    Description string     `xml:",innerxml"`
}

func DecodeXML() {
    file, err := os.Open("window_dump.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 := HierarchyItem{}
    err = xml.Unmarshal(data, &v)
    if err != nil {
        fmt.Printf("error: %v", err)
        return
    }

    fmt.Printf("v is: %+v", v.Node[0].Node[0].Node[0].Node[0].Node[0].Bounds)
}

 

转载于:https://www.cnblogs.com/pu369/p/10460490.html

可以使用 Go 标准库中的 `encoding/xml` 和 `html/template` 包来实现将 XML 转换为 HTML 的功能。 首先,你需要定义一个结构体来存放 XML 数据,例如: ```go type Person struct { XMLName xml.Name `xml:"person"` Name string `xml:"name"` Age int `xml:"age"` } ``` 这个结构体对应一个 XML 格式的数据: ```xml <person> <name>John</name> <age>30</age> </person> ``` 接下来,你可以使用 `encoding/xml` 包中的 `Unmarshal` 函数将 XML 数据解析为结构体: ```go data := []byte(` <person> <name>John</name> <age>30</age> </person> `) var person Person err := xml.Unmarshal(data, &person) if err != nil { panic(err) } ``` 此时,`person` 变量就包含了 XML 数据的内容。 最后,你可以使用 `html/template` 包中的模板引擎来生成 HTML 代码: ```go templateStr := ` <html> <head> <title>{{.Name}}'s page</title> </head> <body> <h1>{{.Name}}</h1> <p>Age: {{.Age}}</p> </body> </html> ` t, err := template.New("webpage").Parse(templateStr) if err != nil { panic(err) } var buf bytes.Buffer err = t.Execute(&buf, person) if err != nil { panic(err) } htmlCode := buf.String() fmt.Println(htmlCode) ``` 在这个例子中,我们使用了一个简单的模板,将 XML 数据转换为 HTML 页面。`{{.Name}}` 和 `{{.Age}}` 是模板中的占位符,它们会被实际的数据替换掉。 完整的示例代码如下: ```go package main import ( "bytes" "encoding/xml" "fmt" "html/template" ) type Person struct { XMLName xml.Name `xml:"person"` Name string `xml:"name"` Age int `xml:"age"` } func main() { data := []byte(` <person> <name>John</name> <age>30</age> </person> `) var person Person err := xml.Unmarshal(data, &person) if err != nil { panic(err) } templateStr := ` <html> <head> <title>{{.Name}}'s page</title> </head> <body> <h1>{{.Name}}</h1> <p>Age: {{.Age}}</p> </body> </html> ` t, err := template.New("webpage").Parse(templateStr) if err != nil { panic(err) } var buf bytes.Buffer err = t.Execute(&buf, person) if err != nil { panic(err) } htmlCode := buf.String() fmt.Println(htmlCode) } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值