gpt4 book ai didi

xml - 在Go中使用unmarshal无法访问命名空间的XML属性

转载 作者:行者123 更新时间:2023-12-01 20:22:13 24 4
gpt4 key购买 nike

在某些XML数据上使用umarshal时,无法访问命名空间标签中的属性。我要完成的工作的一个示例在代码的第14行,该示例演示了如何将name标记中的<cpe-item>属性成功加载到Name结构的CPE字段中。
但是,使用名称分隔标签(例如第19行)执行相同的操作(将name属性从<cpe23: cpe23-item>标记加载到Name结构的CPE23字段中)不起作用-找不到任何值。
我看不到这两个 Action 之间的差异,以及为什么一个失败而另一个没有失败。

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-list xmlns:meta="http://scap.nist.gov/schema/cpe-dictionary-metadata/0.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cpe-23="http://scap.nist.gov/schema/cpe-extension/2.3" xmlns="http://cpe.mitre.org/dictionary/2.0" xmlns:config="http://scap.nist.gov/schema/configuration/0.1" xmlns:ns6="http://scap.nist.gov/schema/scap-core/0.1" xmlns:scap-core="http://scap.nist.gov/schema/scap-core/0.3" xsi:schemaLocation="http://scap.nist.gov/schema/cpe-extension/2.3 https://scap.nist.gov/schema/cpe/2.3/cpe-dictionary-extension_2.3.xsd http://cpe.mitre.org/dictionary/2.0 https://scap.nist.gov/schema/cpe/2.3/cpe-dictionary_2.3.xsd http://scap.nist.gov/schema/cpe-dictionary-metadata/0.2 https://scap.nist.gov/schema/cpe/2.1/cpe-dictionary-metadata_0.2.xsd http://scap.nist.gov/schema/scap-core/0.3 https://scap.nist.gov/schema/nvd/scap-core_0.3.xsd http://scap.nist.gov/schema/configuration/0.1 https://scap.nist.gov/schema/nvd/configuration_0.1.xsd http://scap.nist.gov/schema/scap-core/0.1 https://scap.nist.gov/schema/nvd/scap-core_0.1.xsd">
<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>`

xml.Unmarshal([]byte(contents), &cpes)

for i := 0; i < len(cpes.CPEs); i++ {
fmt.Println("CPE Name: " + cpes.CPEs[i].Name)
fmt.Println("CPE23 Name: " + cpes.CPEs[i].CPE23.Name)
}
}
进入游乐场链接 https://play.golang.org/p/eRMrFePDM4K

最佳答案

不幸的是,documentation没有提供太多见识。与this相对较新的问题进行比较。
但是,可以通过简单地从CPE23字段的标记中删除 namespace 来使代码正常工作:

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"`
}
看到这个Go Play
通过查看encoding/xml包的源代码,可以看到 token 生成器以<ns:foo>的形式读取xml元素标签,其中xmlns:ns="http://mynamespace.com"读入xml.Name结构的形式:
xml.Name{
Space: "http://mynamespace.com",
Local: "foo"
}
然后根据这两个字段解析目标结构上的标签。如果您的struct标记上没有 namespace ,则仅匹配Local的值。

关于xml - 在Go中使用unmarshal无法访问命名空间的XML属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62625631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com