【问题标题】:encoding/xml handle unmapped elementsencoding/xml 处理未映射的元素
【发布时间】:2014-06-04 19:01:18
【问题描述】:

来自http://golang.org/pkg/encoding/xml/#Unmarshal

  • 如果 XML 元素包含与上述任何规则都不匹配的子元素,并且结构中有一个带有标签“,任何”的字段, unmarshal 将子元素映射到该结构字段。

我无法将 XML 信封的其余部分放入我的结构中(以表明我的映射不完整)

http://play.golang.org/p/mnFqAcguJQ

我知道您可以使用 ,inline 将这种方法与 mgo 包中的 bson.M 完全结合使用 - 但看起来 map[string]interface{} 不是这里的答案。

编辑: 在玩了一些额外的游戏后,我发现了一些我认为是一些额外的意外行为。

切换到 []string 作为类型开始接受输入,但没有键/值对:http://play.golang.org/p/wCAJeeQa4m

我还计划调整 encode/xml 以解析 html。我在文档中没有看到如果一个元素多次存在,它将保存它的最后一个实例,而不是出错:http://play.golang.org/p/0MY__R-Xi3

【问题讨论】:

    标签: go


    【解决方案1】:

    这里:http://play.golang.org/p/iY8YlxYym0

    由于c 是具体的东西,它不应该使用",any",因此它应该有一个结构定义。 C 本身包含一个任意标签列表,因此它应该包含一个 []Tag xml:'",any"'... 现在要捕获 Tag 本身,您需要 xml.Name 来获取标签名称和带有“,innerxml”的东西。

    最后的结果是这样的:

    const xmlString = `<foo><a>1</a><b>2</b><c><c1>3</c1><c2>4</c2></c></foo>`
    type Foo struct {
        A int   `xml:"a"`
        B int   `xml:"b"`
        C Extra `xml:"c"`
    }
    
    type Extra struct {
        Items []Tag `xml:",any"`
    }
    
    type Tag struct {
        XMLName xml.Name
        Content string `xml:",innerxml"`
    }
    

    或更短的版本:

    type Foo struct {
        A int   `xml:"a"`
        B int   `xml:"b"`
        C struct {
            Items []struct {
                XMLName xml.Name
                Content string `xml:",innerxml"`
            } `xml:",any"`
        } `xml:"c"`
    }
    

    对于 HTML,有 go.net/html。对 html 使用 xml 解析器会很复杂。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 2018-01-19
      • 2012-09-07
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      相关资源
      最近更新 更多