Gox语言中如何处理XML-GX20
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相关推荐
- Gox语言中使用Sciter库进行GUI图形界面编程-GX23.1
Sciter是非常优秀的跨平台GUI图形界面编程库,只需附带一个动态链接库文件,就可以实现基于HTML/CSS/TiScript的图形界面,并且已经经过很多公司和商用产品的实际检验,稳定可靠.我们常见 ...
- Gox语言中的基本数据类型及其转换-GX5.1
Gox语言默认选用Qlang语法引擎,Qlang脚本语言又是基于Go语言(Golang)做了一定的改进,数据类型基本继承自Go语言,数据的赋值等操作也基本类似但略加改进和变化.一个主要的不同是,Gox ...
- Gox语言中的循环与分支-GX14
Gox语言中实现的循环与分支都是比较简单,也比较好理解的.唯一需要注意的是else if需要写作"elif",其他的基本与Go语言类似. 下面引自Qlang的Github页面, f ...
- Gox语言中的结构类型-GX10.1
Gox语言中,结构类型(struct)其实并不是很常用,因为Gox语言本身就是动态类型的语言,一般的类似结构体的数据直接用数组或者映射类型就可以了,里面的数据项可以是任意类型,包括嵌套复合类型.对映射 ...
- Gox语言中的运算符和操作符-GX13
Gox语言中的运算符和操作符还是比较简单的, // Assignment a = nil println(a) a = true println(a)println("-----" ...
- Gox语言中的函数类型-GX9.1
函数类型是一种特殊的数据类型,表示计算机语言中可以被调用的函数. 在Gox语言中,函数类型是这样定义的. myAdd = fn(a, b) {return a + b + b }c = myAdd(3 ...
- Gox语言中的数组类型及其常用操作 - GX7.1
作为脚本语言,Gox语言中的复合类型当然会设计得更加方便一些,也很容易理解.由于Gox默认使用Qlang脚本引擎,Qlang中关于数组或者叫做切片(也就是Go语言中的slice,以后我们约定这两个称呼 ...
- Gox语言中进行屏幕截图并显示在Sciter图形界面中-GX38.2
本例承接GX38.1一文中的例子,加了一些改进,在进行界面截图后,将图片展示在用Sciter包编写的图形界面上. 代码如下: // 设置github.com/kbinani/screenshot包的简 ...
- Gox语言中使用内存虚拟文件系统提升IO处理速度-GX43.1
Gox语言中,1.06a版本以上,可以利用内置的github.com/topxeq/afero包来将内存中虚拟出一个文件系统.这样,如果内存足够大,完全可以利用它来提升一些文件IO处理的效率. 该包实 ...
最新文章
- 整合大数据价值最大化的三个关键因素
- Squid服务在实际工作中的应用、优化和流量监控
- PaddleOCR加载chinese_ocr_db_crnn_modile模型进行中英文混合预测(Http服务)实践
- yum -y install与yum install有什么不同
- 数据结构0类模板的使用
- Linux课题实践一
- 架构业务wait和sleep区别狭义jiavaBean规范,三层架构模式
- 没了乔布斯,iOS 的 Bug 更多了,更新更频繁了
- linux代替ps的软件,Photoshop的开源替代品 图像编辑器GIMP迎来25岁生日
- Javascript特效:音乐导航
- [Java]Axis需要高版本的J2sdk:j2sdk-1_4_2_08
- 树莓派(Raspberry Pi) 命令行下如何配置wifi(wlan)
- .x3m勒索病毒怎么处理 phobos勒索病毒恢复成功 百分百解密sql文件恢复
- php编辑菱形图案代码,vb怎么输出菱形图案?vb绘制菱形的教程
- 【教程】百度地图AK申请指南(PM2.5指导版)
- 【ACF学习】ACF安装、训练及检测初探
- 倾斜摄影三维实景模型为智慧城市提供全流程可视化支撑
- 支付宝公众服务接口和微信公众平台接口的区别
- c语言写学程序,入门:我的第一个程序|学编程写游戏(C语言)
- 新钛云服助力国际连锁酒店集团实现高效安全运维