Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在GO-with:in标记中分析xml_Xml_Go - Fatal编程技术网

无法在GO-with:in标记中分析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{

我发现,如果XML文件中的标记中有
,则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"`
}