golang 动态xml包的简要使用

dom4j

xquery

etree

最近在弄xml串的处理,找了大半天没找到和json类似动态解析,最后终于找到了etree

从上往下都试了一遍,真实累死。

需求是给两个xml 一个xml往另一个xml中插入或者更新(碰到相同的就更新值,没有的就创建节点)

dom4j bug有点多,抛弃,与java里面的完全不能比。
xmlquery 还行就是用的不太舒服,缺少一些必要的方法,比如当前节点获取path就没有(第一次用找了半天没找到,自己改源码加变量都没生效)
etree 用起来很舒服该有的貌似都有

oldDoc := etree.NewDocument()
	newDoc := etree.NewDocument()
	_, err := oldDoc.ReadFrom(bytes.NewReader(bufAll))
	_, err = newDoc.ReadFrom(bytes.NewReader(fileByte))
	CheckErr(err)
	PutAll(oldDoc.Root(), newDoc.Root())


func PutAll(oldNode *etree.Element, newNode *etree.Element) {
	childElems := newNode.ChildElements()

	if len(childElems) == 0 {
		oldNode.SetText(newNode.Text())
		return
	}

	var tempOldNode *etree.Element
	for _, childElem := range childElems {
		element := oldNode.SelectElement(childElem.Tag)

		if element != nil {
			PutAll(element, childElem)
		} else {
			tempOldNode = oldNode.CreateElement(childElem.Tag)
			PutAll(tempOldNode, childElem)
		}
	}
}

共 0 个回复