为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中使用 unmarshal 访问命名空间 XML 属性时遇到问题

在 Go 中使用 unmarshal 访问命名空间 XML 属性时遇到问题

Go
互换的青春 2022-06-13 15:54:14
在某些 XML 数据上使用 umashal 时,我无法访问命名空间标记中的属性。我正在尝试完成的一个工作示例在我的代码的第 14 行,它演示了成功地将标签中的属性加载name到<cpe-item>结构的Name字段中CPE。但是,对名称间隔的标记执行相同的操作,例如在第 19 行(将name属性从<cpe23: cpe23-item>标记加载到结构的Name字段中CPE23)不起作用 - 没有找到值。我没有看到这两个动作之间的差异以及为什么一个失败而另一个没有。package mainimport (    "encoding/xml"    "fmt")type CPEs struct {    XMLName xml.Name `xml:"cpe-list"`    CPEs    []CPE    `xml:"cpe-item"`}type CPE struct {    Name  string `xml:"name,attr"`    CPE23 CPE23  `xml:"cpe23: cpe23-item"`}type CPE23 struct {    Name string `xml:"cpe23: cpe23-item,name,attr"`}func main() {    var cpes CPEs    contents := `        <cpe-item name="I'm the cpe name!"><!--I can parse this attribute-->            <title>I'm the title!</title>            <references>                    <reference href="https://example.com">Example</reference>                    <reference href="https://example2.com">Example 2</reference>             </references>            <cpe-23:cpe23-item name="CPE 2.3 name!"/><!--I can't parse this attribute-->            </cpe-item>    </cpe-list>`    }}去游乐场链接 https://play.golang.org/p/eRMrFePDM4K
查看完整描述

1 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

不幸的是,文档并没有提供太多的见解。与这个相对较新的问题进行比较。


但是,可以通过简单地从CPE23字段的标记中删除命名空间来使您的代码工作:


type CPE struct {

    Name  string `xml:"name,attr"`

    CPE23 CPE23  `xml:"cpe23-item"`

}


type CPE23 struct {

    Name string `xml:"name,attr"`

}

...或者通过在标签名称前加上完整的命名空间,用空格分隔:


type CPE struct {

    Name  string `xml:"name,attr"`

    CPE23 CPE23  `xml:"http://scap.nist.gov/schema/cpe-extension/2.3 cpe23-item"`

}

看这个去玩


通过查看encoding/xml包的源代码,可以看到标记器将 xml 元素标签以<ns:foo>, where的形式读取到以下形式xmlns:ns="http://mynamespace.com"的xml.Name结构中:


xml.Name{

    Space: "http://mynamespace.com",

    Local: "foo"

}

然后它根据这两个字段解析目标结构上的标签。如果您的 struct 标签上没有命名空间,则它Local仅匹配 的值。


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信