我想解析一些XML結構,如示例中的那些。我不斷遇到空值的情況。這是我正在使用的簡化版本,只是爲了展示問題。在Go中解析xml
package main
import (
"encoding/xml"
"fmt"
)
type Entry struct {
VulnCveId string `xml:"entry>vuln:cve-id"`
}
func main() {
v := Entry{}
err := xml.Unmarshal([]byte(data), &v)
if err != nil {
fmt.Printf("error: %v", err)
return
}
fmt.Println(v.VulnCveId)
}
const data = `
<entry id="CVE-2005-4895">
<vuln:vulnerable-configuration id="http://nvd.nist.gov/">
<cpe-lang:logical-test negate="false" operator="OR">
<cpe-lang:fact-ref name="cpe:/a:csilvers:gperftools:0.3" />
<cpe-lang:fact-ref name="cpe:/a:csilvers:gperftools:0.2" />
<cpe-lang:fact-ref name="cpe:/a:csilvers:gperftools:0.1" />
</cpe-lang:logical-test>
</vuln:vulnerable-configuration>
<vuln:vulnerable-software-list>
<vuln:product>cpe:/a:csilvers:gperftools:0.3</vuln:product>
<vuln:product>cpe:/a:csilvers:gperftools:0.1</vuln:product>
<vuln:product>cpe:/a:csilvers:gperftools:0.2</vuln:product>
</vuln:vulnerable-software-list>
<vuln:cve-id>CVE-2005-4895</vuln:cve-id>
<vuln:published-datetime>2012-07-25T15:55:01.273-04:00</vuln:published-datetime>
<vuln:last-modified-datetime>2012-08-09T00:00:00.000-04:00</vuln:last-modified-datetime>
<vuln:cvss>
<cvss:base_metrics>
<cvss:score>5.0</cvss:score>
<cvss:access-vector>NETWORK</cvss:access-vector>
<cvss:access-complexity>LOW</cvss:access-complexity>
<cvss:authentication>NONE</cvss:authentication>
<cvss:confidentiality-impact>NONE</cvss:confidentiality-impact>
<cvss:integrity-impact>NONE</cvss:integrity-impact>
<cvss:availability-impact>PARTIAL</cvss:availability-impact>
<cvss:source>http://nvd.nist.gov</cvss:source>
<cvss:generated-on-datetime>2012-07-26T08:38:00.000-04:00</cvss:generated-on-datetime>
</cvss:base_metrics>
</vuln:cvss>
<vuln:cwe id="CWE-189" />
<vuln:references xml:lang="en" reference_type="UNKNOWN">
<vuln:source>MISC</vuln:source>
<vuln:reference href="http://kqueue.org/blog/2012/03/05/memory-allocator-security-revisited/" xml:lang="en">http://kqueue.org/blog/2012/03/05/memory-allocator-security-revisited/</vuln:reference>
</vuln:references>
<vuln:references xml:lang="en" reference_type="UNKNOWN">
<vuln:source>CONFIRM</vuln:source>
<vuln:reference href="http://code.google.com/p/gperftools/source/browse/tags/perftools-0.4/ChangeLog" xml:lang="en">http://code.google.com/p/gperftools/source/browse/tags/perftools-0.4/ChangeLog</vuln:reference>
</vuln:references>
<vuln:summary>Multiple integer overflows in TCMalloc (tcmalloc.cc) in gperftools before 0.4 make it easier for context-dependent attackers to perform memory-related attacks such as buffer overflows via a large size value, which causes less memory to be allocated than expected.</vuln:summary>
</entry>
`
v.VulnCveId在這種情況下爲空。我究竟做錯了什麼?
我發佈到golang-nuts google組,查看是否可能是這種情況。 – cmhobbs 2012-08-18 02:14:53
它看起來像名稱空間分隔符實際上是一個空格而不是冒號,所以'xml:「vuln cve-id」'可以工作。接受這個答案,因爲它匹配其他,但你是第一個發佈。 – cmhobbs 2012-08-18 03:44:01