无法在GO-with:in标记中分析xml
我发现,如果XML文件中的标记中有无法在GO-with:in标记中分析xml,xml,go,Xml,Go,我发现,如果XML文件中的标记中有:,则Go中的解组代码似乎不起作用。有什么见解吗 例如,在下面的XML文件中,Summary起作用,但不起作用 <summary>...AIR QUALITY ALERT </summary> <cap:event>Air Quality Alert</cap:event> 你只需要逃离结肠。因此,将xml标记更改为xml:“cap\”event“,它将按照您的预期工作 type Entry struct{
:
,则Go中的解组代码似乎不起作用。有什么见解吗
例如,在下面的XML文件中,Summary
起作用,但不起作用
<summary>...AIR QUALITY ALERT </summary>
<cap:event>Air Quality Alert</cap:event>
你只需要逃离结肠。因此,将xml标记更改为
xml:“cap\”event“
,它将按照您的预期工作
type Entry struct{
Summary string `xml:"summary"`
Cevent string `xml:"cap\:event"`
}
在xml页面上使用unmarshal示例对此进行了测试,只做了少量修改
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)
}
主程序包
进口(
“编码/xml”
“fmt”
)
func main(){
键入电子邮件结构{
Where string`xml:“Where,attr”`
地址字符串
}
类型地址结构{
城市、州字符串
}
类型结果结构{
XMLName xml.Name`xml:“个人”`
名称字符串`xml:“完整\:名称”`
电话线
电子邮件[]电子邮件
组[]字符串`xml:“组>值”`
地址
}
v:=结果{姓名:“无”,电话:“无”}
数据:=`
格雷斯·R·埃姆林
范例公司。
gre@example.com
gre@work.com
朋友
南瓜
安加罗阿
复活节岛
`
错误:=xml.Unmarshal([]字节(数据),&v)
如果错误!=零{
fmt.Printf(“错误:%v”,错误)
返回
}
fmt.Printf(“XMLName:%#v\n”,v.XMLName)
fmt.Printf(“名称:%q\n”,v.Name)
fmt.Printf(“电话:%q\n”,v.Phone)
fmt.Printf(“电子邮件:%v\n”,v.Email)
fmt.Printf(“组:%v\n”,v.Groups)
fmt.Printf(“地址:%v\n”,v.Address)
}
删除转义,它将打印“无”作为名称。使用空格代替
:
或\:
,这样也可以使用。xml中的空格将导致解析错误,因为它显然无效。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事件”
)不起作用
工作示例():
主程序包
输入“fmt”
导入“编码/xml”
类型入口结构{
摘要字符串`xml:“摘要”`
Cevent字符串`xml:“urn:oasis:names:tc:emergency:cap:1.1:cap事件”`
}
func main(){
xmlString:=[]字节(`
…空气质量警报
空气质量警报
`)
条目:=新条目(条目)
如果err:=xml.Unmarshal(xmlString,条目);err==nil{
fmt.Println(条目)
}
}
cap
是名称空间标识符,而不是标记名的一部分。这里是urn:oasis:names:tc:emergency:cap:1.1的缩写
(这个答案似乎对名称空间有一个很好的简明解释:)
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"`
}
这里有一个工作示例:这也适用。不确定为什么会选择一个而不是另一个,或者它们是否等效。下面是一个示例。@LearnGo:
cap
是名称空间标识符,但没有名称空间声明并不意味着什么。您需要为您的文档处理正确的名称空间。非常新的go和xml。我们如何在go中做到这一点?这里是code play.golang.org/p/mjkcfsnaist这在实际文档中不起作用,因为cap
不是名称空间,而是文档块的名称空间标识符。@LearnGo它非常起作用。我刚刚测试了它,并将复制完整的示例。@LearnGo如果这不起作用,请发布一个更完整的示例,以便我们确定还有什么可能是错误的。我已经在这里粘贴了信息。实际的xml文件以及golang页面中的输出和代码。@LearnGo好的,您的实际数据还有很多。有时间我会看一看的。非常感谢。谢谢你的帮助。它实际上是一个原子供体,所以不确定这是否会产生影响。
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"`
}