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