在Go中解析XML时处理名称空间

问题描述 投票:3回答:3

我正在尝试分析Go中的XML:

package main

import (
    "encoding/xml"
    "fmt"
)

type XML struct {
    Foo string `xml:"foo"`
}

func main() {
    rawXML := []byte(`
<xml>
  <foo>A</foo>
  <ns:foo>B</ns:foo>
</xml>`)

    x := new(XML)
    xml.Unmarshal(rawXML, x)
    fmt.Printf("foo: %s\n", x.Foo)
}

此输出:

foo: B

虽然我希望它能产生:

foo: A

如何获取第一个foo标签的内容(即没有名称空间的标签)?

xml go xml-namespaces
3个回答
7
投票

我不认为xml解码器可以指定一个元素不应该带有struct标记的名称空间。但是我确实知道它可以为您检索有关名称空间的信息,然后可以对数据进行后期处理以得到相同的结果:

package main

import (
    "encoding/xml"
    "fmt"
)

type Foo struct {
    XMLName xml.Name
    Data string `xml:",chardata"`
}

type XML struct {
    Foo []Foo `xml:"foo"`
}

func main() {
    rawXML := []byte(`
<xml>
  <foo>A</foo>
  <ns:foo>B</ns:foo>
</xml>`)

    x := new(XML)
    xml.Unmarshal(rawXML, x)
    //fmt.Printf("foo: %#v\n", x)
    for _, el := range x.Foo {
       if el.XMLName.Space == "" {
          fmt.Printf("non namespaced foo %q", el.Data)
      }
    }
}

4
投票

您在xml文档中有两个串联的值。您的结构中只有一个值的余地。 xml解析器解析第一个解析器,然后用第二个解析器覆盖它。


0
投票

xml:"foo"选择器语法采用了可选的命名空间xml:"ns foo",但问题是它不支持选择无命名空间的方法。

© www.soinside.com 2019 - 2024. All rights reserved.