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

在某些 XML 数据上使用 umashal 时,我无法访问命名空间标记中的属性。我正在尝试完成的一个工作示例在我的代码的第 14 行,它演示了成功地将标签中的属性加载name到<cpe-item>结构的Name字段中CPE。


但是,对名称间隔的标记执行相同的操作,例如在第 19 行(将name属性从<cpe23: cpe23-item>标记加载到结构的Name字段中CPE23)不起作用 - 没有找到值。


我没有看到这两个动作之间的差异以及为什么一个失败而另一个没有。


package main


import (

    "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


互换的青春
浏览 165回答 1
1回答

素胚勾勒不出你

不幸的是,文档并没有提供太多的见解。与这个相对较新的问题进行比较。但是,可以通过简单地从CPE23字段的标记中删除命名空间来使您的代码工作:type CPE struct {&nbsp; &nbsp; Name&nbsp; string `xml:"name,attr"`&nbsp; &nbsp; CPE23 CPE23&nbsp; `xml:"cpe23-item"`}type CPE23 struct {&nbsp; &nbsp; Name string `xml:"name,attr"`}...或者通过在标签名称前加上完整的命名空间,用空格分隔:type CPE struct {&nbsp; &nbsp; Name&nbsp; string `xml:"name,attr"`&nbsp; &nbsp; CPE23 CPE23&nbsp; `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{&nbsp; &nbsp; Space: "http://mynamespace.com",&nbsp; &nbsp; Local: "foo"}然后它根据这两个字段解析目标结构上的标签。如果您的 struct 标签上没有命名空间,则它Local仅匹配 的值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go