为了账号安全,请及时绑定邮箱和手机立即绑定

无法在 GO 中使用以下标签解析 xml:在标签中

无法在 GO 中使用以下标签解析 xml:在标签中

Go
繁华开满天机 2021-12-07 10:40:16
我发现如果 XML 文件中的标签包含:在 Go 中的解组代码似乎不起作用。任何见解?例如,在下面的 XML 文件中,Summary可以运行,但不能运行Cevent.<summary>...AIR QUALITY ALERT </summary><cap:event>Air Quality Alert</cap:event>type Entry struct{    Summary    string   `xml:"summary"`    Cevent     string   `xml:"cap:event"`}
查看完整描述

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


查看完整回答
反对 回复 2021-12-07
?
天涯尽头无女友

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)

    } 

}


查看完整回答
反对 回复 2021-12-07
?
12345678_0001

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 中的空格会导致解析错误,因为它显然是无效的。


查看完整回答
反对 回复 2021-12-07
  • 3 回答
  • 0 关注
  • 197 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信