2012-08-17 61 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"` 

,你應該是好去。