如果我有以下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/

10-09 02:26