如何在GOLANG中合并2个XML字符串为1



我想合并2个XML文件为1个新文件。第一个XML是schemadd,第二个XML是带值的标准XML文件,我想把它们合并成一个新文件。

我的问题是每个XML都以"

所以我试着把它们和这段代码合并,但是我得到了错误:

是我的代码

var xml1 map[string]interface{}
var xml2 map[string]interface{}
err1 := xml.Unmarshal([]byte(DTDSchema), &xml1)
err2 := xml.Unmarshal([]byte(xmlContent), &xml2)
maps.Merge(xml2, xml1)
fileContent , err := xml.Marshal(&xml1)

-这是错误:

err1: Error on unmarshal EOF,

err2: unmarshal unknown type map[string]interface{}出错,

你知道吗?

听起来像是要获取一个XML文件并给它一个内联/内部DTD。

您可能会发现使用流/sax类解析器来做您想做的事情更容易。这样,当遇到不需要的东西(比如处理指令)时,就可以很容易地丢弃它们。

https://pkg.go.dev/github.com/nagygr/saxparser
  • https://pkg.go.dev/github.com/mmcdole/goxpp section-readme

我把我的解决方案留给下一代:-)

我发现这个包很有用:https://github.com/beevik/etree

示例代码:

// read xml 
doc := etree.NewDocument()
doc.ReadFromString(xmlContent)
root := doc.Root()
if root == nil {
msg := "Get wrong xml content: "+ xmlContent
return errors.New(msg)
}
// read DTD 
newXmldoc := etree.NewDocument()
newXmldoc.ReadFromString(SchemaDTD)
newXmldoc.SetRoot(root);
newRoot := newXmldoc.Root();
// merge xml into DTD document 
for _, e := range root.Child {
newRoot.AddChild(e)
}
out, err := newXmldoc.WriteToString()
if err != nil {
return err
}

// here out cotain both DTD + xml from 2 diffrent string