我想合并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/saxparserhttps://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