Go中没有Struct的动态XML解析器

xmlquery是用于XML文档的XPath查询包,可让您通过XPath表达式从XML文档提取数据或求值。

它托管在GitHub上,以及README.md文件中的其他文档: //github.com/antchfx/xmlquery

安装

go get github.com/antchfx/xmlquery

package main

import (
	"fmt"
	"strings"

	"github.com/antchfx/xmlquery"
	"github.com/antchfx/xpath"
)

func main() {
	s := `<?xml version="1.0" encoding="UTF-8" ?>
<breakfast_menu>
	<food>
		<name price="10">Berry-Berry Belgian Waffles</name>
		<description>Light Belgian waffles</description>
		<calories>900</calories>
	</food>
	<food>
		<name price="20">French Toast</name>
		<description>Thick slices</description>
		<calories>600</calories>
	</food>
	<food>
		<name price="30">Homestyle Breakfast</name>
		<description>Two eggs, bacon or sausage</description>
		<calories>950</calories>
	</food>
</breakfast_menu>`

	doc, err := xmlquery.Parse(strings.NewReader(s))
	if err != nil {
		panic(err)
	}
	root := xmlquery.FindOne(doc, "//breakfast_menu")
	if n := root.SelectElement("//food/name"); n != nil {
		fmt.Printf("Name #%s\n", n.InnerText())
	}

	if n := root.SelectElement("//food[2]/name"); n != nil {
		fmt.Printf("Name #%s\n", n.InnerText())
	}

	for i, n := range xmlquery.Find(doc, "//food/name/@price") {
		fmt.Printf("Price #%d %s\n", i, n.InnerText())
	}

	for i, n := range xmlquery.Find(doc, "//food/calories") {
		fmt.Printf("Calories #%d %s\n", i, n.InnerText())
	}

	if n := root.SelectElement("//food[2]/name"); n != nil {
		fmt.Printf("Attr #%s\n", n.Attr)
	}

	if n := root.SelectElement("//food[2]/name"); n != nil {
		fmt.Printf("Data #%s\n", n.Data)
	}

	node := xmlquery.FindOne(doc, "//breakfast_menu/food[2]")
	if n := node.SelectElement("//description"); n != nil {
		fmt.Printf("Description #%s\n", n.InnerText())
	}

	expr, err := xpath.Compile("sum(//breakfast_menu/food/name/@price)")
	price := expr.Evaluate(xmlquery.CreateXPathNavigator(doc)).(float64)
	fmt.Printf("Total price: %f\n", price)

	countexpr, err := xpath.Compile("count(//breakfast_menu/food)")
	count := countexpr.Evaluate(xmlquery.CreateXPathNavigator(doc))
	fmt.Printf("Food Node Counts: %f\n", count)
}

运行上面的程序时,您可能会看到以下输出:

Name #Berry-Berry Belgian Waffles
Name #French Toast
Price #0 10
Price #1 20
Price #2 30
Calories #0 900
Calories #1 600
Calories #2 950
Attr #[{{ price} 20}]
Data #name
description #Thick slices
total price: 60.000000
Food Node Counts: 3.000000

您必须阅读的解决方案

Go的简单图像处理包

包装成像提供基本的图像处理功能(调整大小,旋转,裁剪,亮度/对比度调整等)。软件包提供的所有图像处理功能均接受任何实现image.Image接口的图像类型作为输入,并返回* image.NRGBA类型的新图像(32位RGBA颜色,未预乘alpha)。 Source Code

Go Slice Map Filter

一个现代的Go实用程序库,提供了辅助功能。 此辅助函数可以解决常见的问题,例如删除切片中的所有重复项,获取两个集合之间的差异,用值填充数组元素,获取两个集合之间的交集等。消费者尽可能容易和灵活。 Source Code

Golang统计软件包

该软件包提供用于计算数字数据的数学统计量的功能。即使您的数据集太大,也可以使用它。该软件包不能依赖于导入其他模块或软件包或库。您可以获取常用的统计函数,例如平均值,中位数,标准差,方差,相关性,和均值等。 Source Code

CommonRegex 高朗软件包以及示例

这是经常使用的正则表达式的集合。它提供了这些简单功能来获取与特定模式相对应的匹配字符串。这有助于查找字符串中的所有时间,日期,链接,电话号码,电子邮件,ip地址,价格,十六进制颜色和信用卡号。包开发人员做了艰苦的工作,所以我们不必这样做。 Source Code

Golang Chart Package

打包图表是一个非常简单的golang本机图表库,它支持时间序列图和连续线图。 它托管在GitHub上,以及README.md文件中的其他文档: //github.com/wcharczuk/go-chart

Golang HTML parser

包goquery实现了与jQuery类似的功能,包括可链接的语法,以操纵和查询HTML文档。 它为Go语言带来了类似于jQuery的语法和一组功能。它基于Go的net / html包和CSS Selector库cascadia。在语法上,它尽可能接近jQuery,并在可能的情况下使用相同的方法名称,并且具有温暖而模糊的可链接接口。 它托管在GitHub上,以及README.md文件中的其他文档: //github.com/puerkitobio/goquery

进行结构和现场验证示例

包验证器基于标签对结构和各个字段实现值验证。通过使用验证标签或自定义验证程序,它具有以下用于跨字段和跨结构验证的独特功能。切片,阵列和地图潜水,这可以验证多维字段的任何或所有级别。能够深入了解映射键和值以进行验证。 Source Code

Golang中的动态JSON

Gabs是一个小型实用程序,用于处理Go中的动态或未知JSON结构。它不需要您知道有效负载的结构(例如,创建结构),并且可以通过提供指向它们的路径来访问字段。它几乎只是一个有用的包装,用于导航由encoding / json包提供的map [string] interface {}对象的层次结构。除了出色之外,它没有任何壮观的东西。 Source Code

Golang数据时间工具包

现在,这是一个非常简单的程序包,它为标准时间程序包提供了方便的包装,并使得在当前时间使用各种日期和时间构造变得容易。 它托管在GitHub上,以及README.md文件中的其他文档: //github.com/jinzhu/now

最佳组合清单

Go标准库提供了几个可供gopher使用的软件包,以解决他们经常遇到的与编程有关的各种问题。 除了核心程序包,还有一些第三方程序包,对地鼠很有用。而且,大多数这些软件包都是开源的,可以免费使用。因此,让我们检查一些重要的第三方Go软件包,这些软件包对于gopher从事各种项目很有用。该列表包含用于验证,JSON / XML / HTML解析,统计计算等的流行Go软件包。还为其中一些提供了简单的示例。