3 回答
TA贡献1839条经验 获得超15个赞
cap是命名空间标识符,而不是标记名称的一部分。这里是简写urn:oasis:names:tc:emergency:cap:1.1
(这个答案看起来可能对命名空间有一个很好的浓缩解释:XML 中的“xmlns”是什么意思?)
Go“encoding/xml”包不能很好地处理命名空间,但如果没有冲突的标签,你可以完全省略命名空间
type Entry struct {
Summary string `xml:"summary"`
Event string `xml:"event"`
}
指定事件的正确方法,尤其是在不同命名空间中具有相同标签的情况下,将使用完整命名空间,例如:
type Entry struct {
Summary string `xml:"summary"`
Event string `xml:"urn:oasis:names:tc:emergency:cap:1.1 event"`
}
这是一个工作示例:https : //play.golang.org/p/ry55F2pWKY
TA贡献1831条经验 获得超9个赞
cap不是标记名称的一部分,而是命名空间标识符(urn:oasis:names:tc:emergency:cap:1.1如您在评论中提供的那样的缩写)。这是正确的符号:
type Entry struct{
Summary string `xml:"summary"`
Cevent string `xml:"urn:oasis:names:tc:emergency:cap:1.1:cap event"`
}
注意空格而不是:表示命名空间。另请注意,仅使用名称空间标识符(如xml:"cap event")是行不通的。
工作示例(https://play.golang.org/p/rjkb2esGgv):
package main
import "fmt"
import "encoding/xml"
type Entry struct{
Summary string `xml:"summary"`
Cevent string `xml:"urn:oasis:names:tc:emergency:cap:1.1:cap event"`
}
func main() {
xmlString := []byte(`
<doc xmlns:cap = 'urn:oasis:names:tc:emergency:cap:1.1'>
<summary>...AIR QUALITY ALERT </summary>
<cap:event>Air Quality Alert</cap:event>
</doc>
`)
entry := new(Entry)
if err := xml.Unmarshal(xmlString, entry); err == nil {
fmt.Println(entry)
}
}
TA贡献1802条经验 获得超5个赞
你只需要逃避冒号。因此,将您的 xml 标记更改为xml:"cap\:event",它将按您的预期工作。
type Entry struct{
Summary string `xml:"summary"`
Cevent string `xml:"cap\:event"`
}
使用 unmarshal 示例在 xml 页面上对此进行了测试,并稍作修改;
package main
import (
"encoding/xml"
"fmt"
)
func main() {
type Email struct {
Where string `xml:"where,attr"`
Addr string
}
type Address struct {
City, State string
}
type Result struct {
XMLName xml.Name `xml:"Person"`
Name string `xml:"Full\:Name"`
Phone string
Email []Email
Groups []string `xml:"Group>Value"`
Address
}
v := Result{Name: "none", Phone: "none"}
data := `
<Person>
<Full:Name>Grace R. Emlin</Full:Name>
<Company>Example Inc.</Company>
<Email where="home">
<Addr>gre@example.com</Addr>
</Email>
<Email where='work'>
<Addr>gre@work.com</Addr>
</Email>
<Group>
<Value>Friends</Value>
<Value>Squash</Value>
</Group>
<City>Hanga Roa</City>
<State>Easter Island</State>
</Person>
`
err := xml.Unmarshal([]byte(data), &v)
if err != nil {
fmt.Printf("error: %v", err)
return
}
fmt.Printf("XMLName: %#v\n", v.XMLName)
fmt.Printf("Name: %q\n", v.Name)
fmt.Printf("Phone: %q\n", v.Phone)
fmt.Printf("Email: %v\n", v.Email)
fmt.Printf("Groups: %v\n", v.Groups)
fmt.Printf("Address: %v\n", v.Address)
}
删除转义符,它将为 Name 打印“none”。使用空格代替:or \:,它也可以工作。xml 中的空格会导致解析错误,因为它显然是无效的。
- 3 回答
- 0 关注
- 197 浏览
添加回答
举报