Unmarshall innerxml仅用于Golang中的匹配字段

时间:2017-11-09 15:27:43

标签: xml go

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

谢谢!

1 个答案:

答案 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