如果我有以下XML:
<blah>
<a>stuff here</a>
<b>other stuff</b>
<b>more stuff</b>
</blah>
我希望能够解组<blah>
的innerxml,但只包含<b>
元素和所有原始标记,并排除其他所有内容。在此示例中,我的原始innerxml结果必须是:
<b>other stuff</b>
<b>more stuff</b>
不确定这是否适用于struct标签,或者我是否必须编写自定义的unmarshaler函数。
尝试以下代码:
package main
import (
"encoding/xml"
"fmt"
)
type blah struct {
XMLName xml.Name `xml:"blah"`
RawXML string `xml:",innerxml"`
}
func main() {
blahXML := []byte(`<blah>
<a>stuff here</a>
<b>other stuff</b>
<b>more stuff</b>
</blah>`)
var blah blah
if err := xml.Unmarshal(blahXML, &blah); err != nil {
panic(err)
}
fmt.Printf("%s\n", blah.RawXML)
}
返回所有innerxml:
<a>stuff here</a>
<b>other stuff</b>
<b>more stuff</b>
不确定如何返回原始<b>
行。
谢谢!
答案 0 :(得分:0)
如果你想要一个元素的内部XML,那将该元素中的所有内容。你不能选择特定的元素,仍称它为内部XML;这不是XML解析器的工作方式。看起来你真正想要的是文档中所有b
元素的外部XML 。一旦从正确的角度看待它,那就相对容易了。我建议只解组b
元素,如果你只想用那些元素重建XML,那就再次编组:
type blah struct {
XMLName xml.Name `xml:"blah"`
Bees []b `xml:"b"`
}
type b struct {
RawXML string `xml:",innerxml"`
}
func main() {
blahXML := []byte(`<blah>
<a>stuff here</a>
<b>other stuff</b>
<b>more stuff</b>
</blah>`)
test := new(blah)
err := xml.Unmarshal(blahXML, test)
if err != nil {
panic(err)
}
output, err := xml.Marshal(&test)
if err != nil {
panic(err)
}
fmt.Println(string(output))
}
这里的游乐场示例:https://play.golang.org/p/MAtWk2YMld