我正在尝试分析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解码器可以指定一个元素不应该带有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)
}
}
}
您在xml文档中有两个串联的值。您的结构中只有一个值的余地。 xml解析器解析第一个解析器,然后用第二个解析器覆盖它。
xml:"foo"
选择器语法采用了可选的命名空间xml:"ns foo"
,但问题是它不支持选择无命名空间的方法。