如果我有以下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>
不确定这是否适用于结构标记,或者我是否必须编写自定义解组器函数。
尝试了以下代码:
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>
不知道如何返回raw
<b>
行。谢谢!
最佳答案
如果您想要一个元素的内部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
关于xml - 仅对Golang中的匹配字段取消编码innerxml,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47205616/