2012-08-17 70 views
4

我想解析一些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在这种情况下为空。我究竟做错了什么?

回答

0

这看起来像一个几乎对我来说是一个bug。

+0

我发布到golang-nuts google组,查看是否可能是这种情况。 – cmhobbs 2012-08-18 02:14:53

+2

它看起来像名称空间分隔符实际上是一个空格而不是冒号,所以'xml:“vuln cve-id”'可以工作。接受这个答案,因为它匹配其他,但你是第一个发布。 – cmhobbs 2012-08-18 03:44:01

1

注:若没有命名空间相同的查询:http://play.golang.org/p/Gh5WltGzw3

VulnCveId string `xml:"cve-id"` 

,将返回一个非空v.VulnCveId

+0

任何想法为什么命名空间被忽略? – cmhobbs 2012-08-18 02:10:56

1

VulnCveId串xml:"vuln cve-id"这也能正常工作的命名空间的使用空间,而不是冒号

2

的问题是,你没有命名空间。你有一个前缀“vuln”,但它没有在任何地方声明。它实际上甚至不是有效的XML。

做的第一行是:

<entry xmlns:vuln="http://my-namespace.com" id="CVE-2005-4895"> 

然后让你的结构标记这个

`xml:"entry>http://my-namespace.com cve-id"` 

,你应该是好去。