最近在弄 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)
		}
	}
}