xml - 仅对Golang中的匹配字段取消编码innerxml

标签 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>

不确定这是否适用于结构标记,或者我是否必须编写自定义解组器函数。
尝试了以下代码:
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/

相关文章:

generics - Go(语言)通用数字类型/接口(interface)

postgresql - 如何将参数传递给用 PL/pgSQL 编写的查询?

java - 使用 XPATH 解析 XMl 时出现 org.xml.sax.SAXParseException

用于编辑保留格式和注释的 XML 的 Python 库

没有命名空间的 xml 的 Java xsd 验证

go - 我应该如何优化 golang 中的文件轮换?

mysql - 去+MySql : how easy is to migrate to GKE (Google Cloud Container Engine)?

java - 将数字四舍五入到小数点后第一位

xml - 合并巨大的 XML 文件中的值

unit-testing - 单元测试 os.File.Write 调用