我正在try 解析以下XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:eu="http://iec.ch/TC57/CIM100-European#"
    xmlns:md="http://iec.ch/TC57/61970-552/ModelDescription/1#"
    xmlns:cim="http://iec.ch/TC57/CIM100#" > 
  <md:FullModel rdf:about="urn:uuid:52a409c9-72d8-4b5f-bf72-9a22ec9353f7">
   ......

采用GO-xml.NewDecoder(file).Decode(&model)方法.我能够获得所有‘FullModel’和以下所有项,但是我想不出如何获得这些名称空间字符串值:xmlns:rdf,xmlns:EU...

我的代码:https://go.dev/play/p/qF_2er47_3R

我的代码有什么问题?

推荐答案

要从XML生成GO struct ,可以使用生成器,例如miku/zek.还有online version个. 此代码应按预期工作:https://go.dev/play/p/xUShK1Wpk8g

您的根 node 是RDF,它的子 node 是FullModel,但是您描述的 FullModel与您的 struct 中的RDF处于同一级别.

如果需要设置根 node 的名称,可以使用xml.Name struct 字段类型.根据encoding/xml年的文档:

XML元素的名称取自,按优先顺序排列:

XMLName字段上的标记,如果数据是 struct ,则返回 类型名称的XMLName字段用于获取 数据用于获取数据的 struct 字段的名称 属于封送类型的

您的代码:

type RDF struct {
    Rdf string `xml:"rdf,attr"`
    Eu  string `xml:"eu,attr"`
    Md  string `xml:"md,attr"`
    Cim string `xml:"cim,attr"`
}

type File_model struct {
    RDF   RDF       `xml:"RDF"`
    Model FullModel `xml:"FullModel"`
}

生成的 struct :

type RDF struct {
    XMLName   xml.Name `xml:"RDF"`
    Text      string   `xml:",chardata"`
    Rdf       string   `xml:"rdf,attr"`
    Eu        string   `xml:"eu,attr"`
    Md        string   `xml:"md,attr"`
    Cim       string   `xml:"cim,attr"`
    FullModel struct {
        Text                      string `xml:",chardata"`
        About                     string `xml:"about,attr"`
        ...
    } `xml:"FullModel"`
    AccumulatorLimit struct {
        Text                        string `xml:",chardata"`
        ID                          string `xml:"ID,attr"`
        ...
}

Go相关问答推荐

golang 的条件储存库

Golang html/模板&需要错误数量的参数1在模板中使用';调用';获得0&q;

获取作为类型参数传递给方法接收方中的类型参数的切片的基础类型

如何预编译Golang标准库?

在GO中创建[]字符串类型的变量

Wamtime Memory中的‘Offset’是什么?Read?

转到http服务器头内容-类型设置为多部分/表单-数据,但在客户端获取内容-类型:文本/纯文本

重新赋值变量时未清除动态类型-这是错误吗?

当我使用 CircleCI 构建 Go Image 时,我得到runtime/cgo: pthread_create failed: Operation not allowed

我应该先解锁然后再广播吗?

Opensearch 错误 ping 弹性服务器:由未知权威签署的 x509 证书

当填充通道的函数调用未嵌入 goroutine 时,为什么我会遇到死锁?

创建新对象后如何返回嵌套实体?

设置指向空接口的指针

GqlGen - 在字段解析器中访问查询输入参数

Golang Getrlimit 返回与 ulimit 不同的值

无法建立连接,因为目标机器主动拒绝它 Golang

具有近似约束的函数值导致的实例化失败

Go GCP 同时模拟两个服务帐户

Go generics:我会在哪里使用 any 而不是 interface{}?