解析GO中的Xml以在标记中带有“:”的属性

时间:2018-07-27 13:59:01

标签: xml go xml-parsing

我想解析Xml文件的属性。 它适用于任何“正常”属性,例如<application name="AppName">

但是如果属性中包含“:”,我就无法设法获取它的值,例如<application name:test="AppName">

这是我用来解析此代码:

package main

import "fmt"
import "encoding/xml"

type Application struct {
    Event Event `xml:"application"`
    Package   string    `xml:"package,attr"`
}

type Event struct {
    IsValid   string `xml:"test:isValid,attr"`
}

var doc = []byte(`<?xml version="1.0" encoding="utf-8" standalone="no"?>
    <application package="leNomDuPackage">
            <event test:isValid="true">
        </application>
</manifest>`)

func main() {
    application := Application{}
    xml.Unmarshal(doc, &application)

    fmt.Println("Application:  ", application)
    fmt.Println("isValid:", application.Event)
}

您也可以在Golang游乐场中找到它:[https://play.golang.org/p/R6H80xPezhm

我想检索isValid属性的值。

目前,我收到该错误消息,但无法解决。

  

结构字段标记xml:"test\:isValid,attr与reflect.StructTag.Get不兼容:结构标记值的语法错误

我也尝试了以下值

type Event struct {
    IsValid   string `xml:"test isValid,attr`
}

type Event struct {
    IsValid   string `xml:"test\:isValid,attr`
}

但是效果不佳。

1 个答案:

答案 0 :(得分:4)

您可以在标签定义中省略"test:"前缀。只要确保您的XML有效,您的XML就没有<event>的结束标记,并且没有匹配的结束标记</manifest>。您还缺少标记定义中的右引号。

型号:

type Application struct {
    Event   Event  `xml:"event"`
    Package string `xml:"package,attr"`
}

type Event struct {
    IsValid string `xml:"isValid,attr"`
}

有效的XML示例:

var doc = `
<application package="leNomDuPackage">
    <event test:isValid="true" />
</application>`

代码解析:

application := Application{}
err := xml.Unmarshal([]byte(doc), &application)
if err != nil {
    fmt.Println(err)
}

fmt.Printf("Application: %#v\n", application)

输出(在Go Playground上尝试):

Application: main.Application{Event:main.Event{IsValid:"true"},
    Package:"leNomDuPackage"}

请注意,如果您有多个具有相同名称但前缀不同的属性,例如以下示例:

var doc = `
<application package="leNomDuPackage">
    <event test:isValid="true" test2:isValid="false" />
</application>`

然后,您可以在标签值中添加名称空间前缀,与名称之间用空格分隔,如下所示:

type Event struct {
    IsValid1 string `xml:"test isValid,attr"`
    IsValid2 string `xml:"test2 isValid,attr"`
}

解析代码是相同的。输出(在Go Playground上尝试):

Application: main.Application{Event:main.Event{IsValid1:"true", 
    IsValid2:"false"}, Package:"leNomDuPackage"}