Go语言学习(八) Go语言动态解析XML

原生的encoding/xml库中的Unmarshal函数可以解析xml,但需要先定义相应的结构体,如果xml结构复杂,还需要定义多个结构体。这在解析一些多层嵌套xml中显得非常被动。采用etree解析xml,能够做到动态解析xml,类似java里的dom4j。

1、安装etree包

go get github.com/beevik/etree

2、xml例子

<?xml version="1.0" encoding="UTF-8"?>
<permission>
    <menus>
        <menu key="menu1" >这是一个menu1描述</menu>
        <menu key="menu2" >这是一个menu2描述</menu>
        <menu key="menu3" >这是一个menu3描述</menu>
    </menus>
    <urls>
        <!--用户部分-->
        <!--后台-manager-->
        <url key="1" >/user/t1</url>
        <!--<url key="2" >/user/getDetailHeader</url>-->
        <url key="3" >/user/findBusiness</url>
        <url key="4" >/user/findApply</url>
        <url key="5" >/user/getDetails</url>
        <url key="6" >/user/updateStatus</url>
        <url key="7" >/user/examineFalse</url>
        <url key="8" >/user/registerForBusiness</url>
        <url key="9" >/user/deleteForBusiness</url>
        <url key="10" >/user/exportApply</url>
        <url key="11" >/user/exportBusiness</url>
        <url key="12" >/user/resetPassword</url>
        <!--申请单位apply和业务部门web-->
        <url key="13" >/user/updatePassword</url>
        <url key="14" >/user/updateApplyUser</url>



        <!--信息公告-->
        <!--manager-->
        <url key="15" >/notice/insert</url>
        <url key="16" >/notice/findBy</url>
        <url key="17" >/notice/update</url>
        <url key="18" >/notice/UpDown</url>
        <url key="19" >/notice/deleteNotice</url>
        <url key="20" >/notice/getNoticeHeader</url>

        <!--U盾-manager-->
        <url key="21" >/usbkey/**</url>

        <!--企业信息 apply-->
        <url key="22" >/unit/updateUnit</url>

        <!--联系人apply-->
        <url key="23" >/contact/updateContactForUnit</url>
        <url key="24" >/contact/delete</url>
        <!--联系人-业务部门-->
        <url key="25" >/contact/updateContactForBusiness</url>

        <!--申请-apply-->
        <url key="26" >/apply/save</url>
        <url key="27" >/apply/detail/**</url>
        <url key="28" >/apply/header/**</url>
        <url key="29" >/apply/data/**</url>
        <!--业务部门-->
        <url key="30" >/apply/detailForBusiness/**</url>
        <url key="31" >/apply/to/data/**</url>
        <url key="32" >/apply/export/**</url>
        <url key="33" >/apply/to/header</url>

        <!--批次-->
        <!--申请 业务部门-->
        <url key="34" >/batch/save</url>
        <url key="35" >/batch/data</url>
        <url key="36" >/batch/detail/**</url>
        <url key="45" >/batch/header/**</url>

        <!--我的关注-->
        <!--申请单位 apply-->
        <url key="37" >/follow/**</url>

        <!--指南-->
        <!--业务部门-->
        <url key="38" >/guide/publish/header</url>
        <url key="39" >/guide/publish/data</url>
        <url key="40" >/guide/save</url>
        <url key="41" >/guide/field</url>
        <url key="42" >/guide/import</url>
        <!--申请单位和业务部门-->
        <url key="43" >/guide/export/**</url>


        <url key="44" >/statistic/apply/**</url>
        <url key="46" >/statistic/system/**</url>
        <url key="47" >/statistic/web/**</url>
    </urls>

    <roles>

        <role key="manager" name="普通管理员">
            <ref-urls>
                1,3,4,5,6,7,8,9,10,11,12,15,16,17,18,19,20,21,44,46,47
            </ref-urls>
            <ref-menus>
                menu1,menu2,menu3
            </ref-menus>
        </role>

        <role key="super" name="超级管理员">
            <ref-urls>

            </ref-urls>
            <ref-menus>
                menu1,menu2
            </ref-menus>
        </role>
        <role key="apply" name="apply">
            <ref-urls>
                5,13,14,23,24,26,27,28,29,37,43
            </ref-urls>
            <ref-menus>
                menu1,menu2
            </ref-menus>
        </role>
        <role key="web" name="web">
            <ref-urls>
                5,13,14,25,30,31,32,33,34,35,36,38,39,40,41,42,43,45
            </ref-urls>
            <ref-menus>
                menu1,menu2
            </ref-menus>
        </role>

        <role key="unCheck" name="未审核通过的用户角色">
            <ref-urls>

            </ref-urls>
            <ref-menus>
                menu1,menu2
            </ref-menus>
        </role>
        <!-- <role key="super">超级管理员</role>       -->
    </roles>

</permission>

3、假设我们解析其中的url,下面是例子

package models

type Url struct {
	Key string
	Name string
}
func (as *AuthorService) GetUrls() map[string]models.Url  {
	result := make(map[string]models.Url)
	doc := etree.NewDocument()
	if err := doc.ReadFromFile("./conf/auth.xml"); err != nil {
		panic(err)
	}
	root := doc.SelectElement("permission")
	urlsElement := root.FindElement("./urls")
	urlElements := urlsElement.FindElements("./url")
	if urlElements != nil {
		for _, urlElement := range urlElements {
			key := urlElement.SelectAttr("key").Value
			name := urlElement.Text()
			url := new(models.Url)
			url.Key = key
			url.Name = name
			result[key] = *url
		}
	}
	return result
}

说明一下其中几个函数的用处:

doc.ReadFromFile("./conf/auth.xml") 读取配置xml文件
doc.SelectElement("permission") 搜索子节点,但是仅限于搜索孩子节点
root.FindElement("./urls") 支持X-path搜索,返回符合条件的第一个标签
urlsElement.FindElements("./url") 返回所有符合条件的标签
urlElement.SelectAttr("key").Value 获取标签上的属性
urlElement.Text() 获取标签的值
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值