如何用Go读取RDF XML文件中的命名空间属性?代码问题排查
Go解析RDF XML时无法获取命名空间值的问题
我尝试用Go的xml.NewDecoder(file).Decode(&model)方法解析以下RDF 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"> ......
目前能成功解析获取FullModel及后续内容,但无法获取xmlns:rdf、xmlns:eu等命名空间的字符串值,请问代码存在什么问题?
问题原因
Go标准库的encoding/xml包默认不会把XML根元素上的命名空间声明属性(即xmlns:*格式的属性)自动映射到结构体字段,因为这些属性属于XML的命名空间机制范畴,而非普通业务属性。你的代码里没有为这些命名空间声明定义对应的结构体字段,所以解码器不会解析它们。
解决方案
修改对应结构体,为每个命名空间声明添加显式的字段,并通过xml标签指定属性名:
import "encoding/xml" type FullModel struct { XMLName xml.Name `xml:"md:FullModel"` About string `xml:"rdf:about,attr"` // 其他FullModel字段... } type RDF struct { XMLName xml.Name `xml:"rdf:RDF"` // 显式定义命名空间属性字段 RDFNS string `xml:"xmlns:rdf,attr"` EUNS string `xml:"xmlns:eu,attr"` MDNS string `xml:"xmlns:md,attr"` CIMNS string `xml:"xmlns:cim,attr"` FullModel FullModel `xml:"md:FullModel"` }
这样当你调用Decode方法时,根元素上的xmlns:rdf等属性值就会被解析到对应的结构体字段中。
内容的提问来源于stack exchange,提问作者L Kwiatkowski
相关产品推荐
相关产品推荐

