Gox语言中集成了Go语言的第三方库etree,因此已经内置XML文档的处理功能。etree更详细的文档可参考这里。

我们直接来看下面这个例子:

etree = github_beevik_etreereshapeXMLX = fn(xmlA) {treeT = etree.NewDocument()if treeT == nil {return tk.GenerateErrorStringF("create XML tree failed")}errT = treeT.ReadFromString(xmlA)if errT != nil {return tk.GenerateErrorStringF("invalid XML: %v", errT)}treeT.Indent(2)outputT, errT = treeT.WriteToString()if errT != nil {return tk.GenerateErrorStringF("failed to reshape XML: %v", errT)}return outputT}flattenXML = fn(xmlA, nodeA) {treeT = etree.NewDocument()if treeT == nil {return tk.GenerateErrorStringF("create XML tree failed")}errT = treeT.ReadFromString(xmlA)if errT != nil {return tk.GenerateErrorStringF("invalid XML: %v", errT)}rootNodeT = treeT.FindElement("//" + nodeA)if rootNodeT == nil {return tk.GenerateErrorStringF("node not found: %v", nodeA)}nodesT = rootNodeT.ChildElements()bufT = new(strings.Builder)for i, v = range nodesT {if i > 0 {bufT.WriteString("\n")}bufT.WriteString(tk.Spr("%v: %v", v.Tag, v.Text()))}return bufT.String()}getMSSFromXML = fn(xmlA, nodeA) {treeT = etree.NewDocument()if treeT == nil {return nil, tk.Errf("create XML tree failed")}errT = treeT.ReadFromString(xmlA)if errT != nil {return nil, tk.Errf("invalid XML: %v", errT)}rootNodeT = treeT.FindElement("//" + nodeA)if rootNodeT == nil {return nil, tk.Errf("node not found: %v", nodeA)}nodesT = rootNodeT.ChildElements()mapT = make(map[string]string, len(nodesT))for _, jv = range nodesT {mapT[jv.Tag] = jv.Text()}return mapT, nil
}getMSSArrayFromXML = fn(xmlA, nodeA) {treeT = etree.NewDocument()if treeT == nil {return nil, tk.Errf("create XML tree failed")}errT = treeT.ReadFromString(xmlA)if errT != nil {return nil, tk.Errf("invalid XML: %v", errT)}rootNodeT = treeT.FindElement("//" + nodeA)if rootNodeT == nil {return nil, tk.Errf("node not found: %v", nodeA)}nodesT = rootNodeT.ChildElements()aryT = make([]map[string]string, 0)for _, v = range nodesT {internalNodesT = v.ChildElements()mapT = make(map[string]string, len(internalNodesT))for _, jv = range internalNodesT {mapT[jv.Tag] = jv.Text()}aryT = append(aryT, mapT)}return aryT, nil
}xmlT = `<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body><ZvendorNameFuzquery xmlns="urn:sap-com:document:sap:soap:functions:mc-style"><Iname xmlns="">北京大学</Iname><Iresv1 xmlns="">简称:北大</Iresv1><Iresv2 xmlns=""></Iresv2><Tname xmlns=""></Tname></ZvendorNameFuzquery>
</Body>
</Envelope>`resultT = reshapeXMLX(xmlT)println(resultT)println("\n-----\n")resultT = flattenXML(xmlT, "ZvendorNameFuzquery")println(resultT)println("\n-----\n")resultT = getMSSFromXML(xmlT, "ZvendorNameFuzquery")println(resultT)println("\n-----\n")xmlT = `<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body><ZvendorNameFuzquery xmlns="urn:sap-com:document:sap:soap:functions:mc-style"><item><Iname xmlns="">北京大学</Iname><Iresv1 xmlns="">简称:北大</Iresv1><Iresv2 xmlns=""></Iresv2><Tname xmlns=""></Tname></item><item><Iname xmlns="">清华大学</Iname><Iresv1 xmlns=""></Iresv1><Iresv2 xmlns="">地址</Iresv2><Tname xmlns=""></Tname></item></ZvendorNameFuzquery>
</Body>
</Envelope>`resultT = getMSSArrayFromXML(xmlT, "ZvendorNameFuzquery")println(resultT)

首先,我们将使用github.com/beevik/etree包,这是一个Go语言中非常优秀的处理XML的第三方包。虽然可以直接按Gox约定的github_beevik_etree来使用该包,但为了代码简洁,在一开始我们给它定义了一个简称变量etree。

然后用etree.NewDocument()函数创建一个XML文档对象后,就可以进行各种处理了。

代码中的reshapeXMLX函数是将XML字符串进行重新格式化的函数;

flattenXML函数则是将XML中指定节点下的所有子节点提取出来生成一个数组(注意只能提取一级);

getMSSFromXML函数则是将XML中指定节点下的内容提取成为map[string]string格式的映射;

getMSSArrayFromXML函数则是用于提取一个数组,形式为[]map[string]string。

代码的执行结果如下:

λ gox scripts\xml.gox
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"><Body><ZvendorNameFuzquery xmlns="urn:sap-com:document:sap:soap:functions:mc-style"><Iname xmlns="">北京大学</Iname><Iresv1 xmlns="">简称:北大</Iresv1><Iresv2 xmlns=""/><Tname xmlns=""/></ZvendorNameFuzquery></Body>
</Envelope>-----0xc000068c10: 北京大学
0xc000068c70: 简称:北大
0xc000068cd0:
0xc000068d30:-----[map[Iname:北京大学 Iresv1:简称:北大 Iresv2: Tname:] <nil>]-----[[map[Iname:北京大学 Iresv1:简称:北大 Iresv2: Tname:] map[Iname:清华大学 Iresv1: Iresv2:地址 Tname:]] <nil>]

可以看到结果都符合预期。

至于如何生成XML文档、添加各种节点等,请参考etree的详细文档。


* 注:由于0.988版本后,为了减少不必要的文件体积,Gox已经放弃了其他脚本引擎,仅支持Qlang引擎,因此下面的内容已经无效,仅留作对旧版本的参考。

下面是Anko引擎版的代码:

tk = import("tk")
etree = import("etree")
strings = import("strings")func reshapeXMLX(xmlA) {treeT = etree.NewDocument()if treeT == nil {return tk.GenerateErrorStringF("create XML tree failed")}errT = treeT.ReadFromString(xmlA)if errT != nil {return tk.GenerateErrorStringF("invalid XML: %v", errT)}treeT.Indent(2)outputT, errT = treeT.WriteToString()if errT != nil {return tk.GenerateErrorStringF("failed to reshape XML: %v", errT)}return outputT}func flattenXML(xmlA, nodeA) {treeT = etree.NewDocument()if treeT == nil {return tk.GenerateErrorStringF("create XML tree failed")}errT = treeT.ReadFromString(xmlA)if errT != nil {return tk.GenerateErrorStringF("invalid XML: %v", errT)}rootNodeT = treeT.FindElement("//" + nodeA)if rootNodeT == nil {return tk.GenerateErrorStringF("node not found: %v", nodeA)}nodesT = rootNodeT.ChildElements()bufT = make(strings.Builder)i = 0for v in nodesT {if i > 0 {bufT.WriteString("\n")}bufT.WriteString(tk.Spr("%v: %v", v.Tag, v.Text()))i++}return bufT.String()}func getMSSFromXML(xmlA, nodeA) {treeT = etree.NewDocument()if treeT == nil {return nil, tk.Errf("create XML tree failed")}errT = treeT.ReadFromString(xmlA)if errT != nil {return nil, tk.Errf("invalid XML: %v", errT)}rootNodeT = treeT.FindElement("//" + nodeA)if rootNodeT == nil {return nil, tk.Errf("node not found: %v", nodeA)}nodesT = rootNodeT.ChildElements()mapT = make(map[string]string, len(nodesT))for jv in nodesT {mapT[jv.Tag] = jv.Text()}return mapT, nil
}func getMSSArrayFromXML(xmlA, nodeA) {treeT = etree.NewDocument()if treeT == nil {return nil, tk.Errf("create XML tree failed")}errT = treeT.ReadFromString(xmlA)if errT != nil {return nil, tk.Errf("invalid XML: %v", errT)}rootNodeT = treeT.FindElement("//" + nodeA)if rootNodeT == nil {return nil, tk.Errf("node not found: %v", nodeA)}nodesT = rootNodeT.ChildElements()aryT = make([]map[string]string, 0)for v in nodesT {internalNodesT = v.ChildElements()mapT = make(map[string]string, len(internalNodesT))for jv in internalNodesT {mapT[jv.Tag] = jv.Text()}aryT += mapT}return aryT, nil
}xmlT = `<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body><ZvendorNameFuzquery xmlns="urn:sap-com:document:sap:soap:functions:mc-style"><Iname xmlns="">北京大学</Iname><Iresv1 xmlns="">简称:北大</Iresv1><Iresv2 xmlns=""></Iresv2><Tname xmlns=""></Tname></ZvendorNameFuzquery>
</Body>
</Envelope>`resultT = reshapeXMLX(xmlT)println(resultT)println("\n-----\n")resultT = flattenXML(xmlT, "ZvendorNameFuzquery")println(resultT)println("\n-----\n")resultT = getMSSFromXML(xmlT, "ZvendorNameFuzquery")println(resultT)println("\n-----\n")xmlT = `<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body><ZvendorNameFuzquery xmlns="urn:sap-com:document:sap:soap:functions:mc-style"><item><Iname xmlns="">北京大学</Iname><Iresv1 xmlns="">简称:北大</Iresv1><Iresv2 xmlns=""></Iresv2><Tname xmlns=""></Tname></item><item><Iname xmlns="">清华大学</Iname><Iresv1 xmlns=""></Iresv1><Iresv2 xmlns="">地址</Iresv2><Tname xmlns=""></Tname></item></ZvendorNameFuzquery>
</Body>
</Envelope>`resultT = getMSSArrayFromXML(xmlT, "ZvendorNameFuzquery")println(resultT)

代码的执行结果如下:

λ gox scripts\xml.gox
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"><Body><ZvendorNameFuzquery xmlns="urn:sap-com:document:sap:soap:functions:mc-style"><Iname xmlns="">北京大学</Iname><Iresv1 xmlns="">简称:北大</Iresv1><Iresv2 xmlns=""/><Tname xmlns=""/></ZvendorNameFuzquery></Body>
</Envelope>-----Iname: 北京大学
Iresv1: 简称:北大
Iresv2:
Tname:-----[map[Iname:北京大学 Iresv1:简称:北大 Iresv2: Tname:] <nil>]-----[[map[Iname:北京大学 Iresv1:简称:北大 Iresv2: Tname:] map[Iname:清华大学 Iresv1: Iresv2:地址 Tname:]] <nil>]

Gox语言中如何处理XML-GX20相关推荐

  1. Gox语言中使用Sciter库进行GUI图形界面编程-GX23.1

    Sciter是非常优秀的跨平台GUI图形界面编程库,只需附带一个动态链接库文件,就可以实现基于HTML/CSS/TiScript的图形界面,并且已经经过很多公司和商用产品的实际检验,稳定可靠.我们常见 ...

  2. Gox语言中的基本数据类型及其转换-GX5.1

    Gox语言默认选用Qlang语法引擎,Qlang脚本语言又是基于Go语言(Golang)做了一定的改进,数据类型基本继承自Go语言,数据的赋值等操作也基本类似但略加改进和变化.一个主要的不同是,Gox ...

  3. Gox语言中的循环与分支-GX14

    Gox语言中实现的循环与分支都是比较简单,也比较好理解的.唯一需要注意的是else if需要写作"elif",其他的基本与Go语言类似. 下面引自Qlang的Github页面, f ...

  4. Gox语言中的结构类型-GX10.1

    Gox语言中,结构类型(struct)其实并不是很常用,因为Gox语言本身就是动态类型的语言,一般的类似结构体的数据直接用数组或者映射类型就可以了,里面的数据项可以是任意类型,包括嵌套复合类型.对映射 ...

  5. Gox语言中的运算符和操作符-GX13

    Gox语言中的运算符和操作符还是比较简单的, // Assignment a = nil println(a) a = true println(a)println("-----" ...

  6. Gox语言中的函数类型-GX9.1

    函数类型是一种特殊的数据类型,表示计算机语言中可以被调用的函数. 在Gox语言中,函数类型是这样定义的. myAdd = fn(a, b) {return a + b + b }c = myAdd(3 ...

  7. Gox语言中的数组类型及其常用操作 - GX7.1

    作为脚本语言,Gox语言中的复合类型当然会设计得更加方便一些,也很容易理解.由于Gox默认使用Qlang脚本引擎,Qlang中关于数组或者叫做切片(也就是Go语言中的slice,以后我们约定这两个称呼 ...

  8. Gox语言中进行屏幕截图并显示在Sciter图形界面中-GX38.2

    本例承接GX38.1一文中的例子,加了一些改进,在进行界面截图后,将图片展示在用Sciter包编写的图形界面上. 代码如下: // 设置github.com/kbinani/screenshot包的简 ...

  9. Gox语言中使用内存虚拟文件系统提升IO处理速度-GX43.1

    Gox语言中,1.06a版本以上,可以利用内置的github.com/topxeq/afero包来将内存中虚拟出一个文件系统.这样,如果内存足够大,完全可以利用它来提升一些文件IO处理的效率. 该包实 ...

最新文章

  1. 整合大数据价值最大化的三个关键因素
  2. Squid服务在实际工作中的应用、优化和流量监控
  3. PaddleOCR加载chinese_ocr_db_crnn_modile模型进行中英文混合预测(Http服务)实践
  4. yum -y install与yum install有什么不同
  5. 数据结构0类模板的使用
  6. Linux课题实践一
  7. 架构业务wait和sleep区别狭义jiavaBean规范,三层架构模式
  8. 没了乔布斯,iOS 的 Bug 更多了,更新更频繁了
  9. linux代替ps的软件,Photoshop的开源替代品 图像编辑器GIMP迎来25岁生日
  10. Javascript特效:音乐导航
  11. [Java]Axis需要高版本的J2sdk:j2sdk-1_4_2_08
  12. 树莓派(Raspberry Pi) 命令行下如何配置wifi(wlan)
  13. .x3m勒索病毒怎么处理 phobos勒索病毒恢复成功 百分百解密sql文件恢复
  14. php编辑菱形图案代码,vb怎么输出菱形图案?vb绘制菱形的教程
  15. 【教程】百度地图AK申请指南(PM2.5指导版)
  16. 【ACF学习】ACF安装、训练及检测初探
  17. 倾斜摄影三维实景模型为智慧城市提供全流程可视化支撑
  18. 支付宝公众服务接口和微信公众平台接口的区别
  19. c语言写学程序,入门:我的第一个程序|学编程写游戏(C语言)
  20. 新钛云服助力国际连锁酒店集团实现高效安全运维

热门文章

  1. 消息队列(MQ)到底能干什么?
  2. 手把手教你搭建可视化数据大屏
  3. java类加载和双亲委派模型浅说
  4. 成功入职字节跳动的小姐姐告诉你,Android面试吃透这一篇就没有拿不到的offer!
  5. yum方式安装mySql
  6. 列表(list)和数据框(pd.DataFrame)两者的区别有哪些?
  7. Python输出斐波那契数列【递归、迭代】
  8. three.js的着色器(巨详细 初学者 大白话)
  9. ICMS開源内容管理系统
  10. 靶机测试 0s-hackNos-2笔记