2015-10-13 57 views
-1

我想用golang解析xml。作为使用go的新手,我已经阅读了关于Web的文章,解释了如何解析XML,但我不确定为什么我的返回值是nil<nil>解析golang中的xml字符串

package main 

import (
    "fmt" 
    //"io/ioutil" 
    "encoding/xml" 
) 

func check(e error) { 
    if e != nil { 
     panic(e) 
    } 
} 

type Books struct { 
    XMLName xml.Name `xml:"Books"` 
    BookList []Book `xml:"Books>Book"` 
} 

type Book struct { 
    title string `xml:"title,attr"` 
    author string 
    published string 
} 

func main() { 
    //f, err := ioutil.ReadFile("xml/Books.xml") 
    //check(err) 

    var data = []byte(` 
     <Books> 
      <Book title="A Brief History of Time" author="Stephen Hawking" published="1988"> 
       <title>title here</title> 
       A Brief History of Time: From the Big Bang to Black Holes is a 1988 popular-science book by British physicist Stephen Hawking. It became a bestseller and sold more than 10 million copies in 20 years. 
      </Book> 
      <Book title="Steve Jobs" author="Walter Isaacson" published="2011"> 
       Steve Jobs is the authorized self-titled biography book of Steve Jobs. The book was written at the request of Jobs by Walter Isaacson, a former executive at CNN. 
      </Book> 
     </Books> 
    `) 

    b := Books{} 
    o := xml.Unmarshal([]byte(data), &b) 
    fmt.Println(o) 
} 
+3

您正在打印错误,因为它的工作原因,它是零。 'xml.Unmarshal'不返回正在传入的值 - second arg'&b'。另外在你输入'Book'时,这些字段是未导出的(需要在第一个字母时改为大写),所以解组器不能设置它们的值。 – evanmcdonnal

回答

2

我把调试反馈,评论,但是我刚刚修改了例如工作,它可以在这里进行测试; https://play.golang.org/p/_UIph2je7f

package main 

import (
    "fmt" 
    //"io/ioutil" 
    "encoding/xml" 
) 

func check(e error) { 
    if e != nil { 
     panic(e) 
    } 
} 

type Books struct { 
    XMLName xml.Name `xml:"Books"` 
    BookList []Book `xml:"Book"` 
} 

type Book struct { 
    Title string `xml:"title,attr"` 
    Author string `xml:"author,attr"` 
    Published string `xml:"published,attr"` 
} 

func main() { 
    //f, err := ioutil.ReadFile("xml/Books.xml") 
    //check(err) 

    var data = []byte(` 
     <Books> 
      <Book title="A Brief History of Time" author="Stephen Hawking" published="1988"> 
       <title>title here</title> 
       A Brief History of Time: From the Big Bang to Black Holes is a 1988 popular-science book by British physicist Stephen Hawking. It became a bestseller and sold more than 10 million copies in 20 years. 
      </Book> 
      <Book title="Steve Jobs" author="Walter Isaacson" published="2011"> 
       Steve Jobs is the authorized self-titled biography book of Steve Jobs. The book was written at the request of Jobs by Walter Isaacson, a former executive at CNN. 
      </Book> 
     </Books> 
    `) 

    b := Books{} 
    o := xml.Unmarshal([]byte(data), &b) 
    fmt.Println(o) 
    fmt.Println(b) 
} 

这里是我做了四个转变一个破败的;

1)打印代替ERR从Unmarshal

2返回Books对象)大写领域的第一个字母上Book,使他们“出口”,使他们能够获得/其他包设置(在解组在这种情况下)

3)添加xml属性。在导出字段时,它使得它没有隐式字符串匹配,因此您必须明确指定将哪个xml值读入每个字段

4)更新BookList的XML路径,因为您认为它应该是Books> Book,但这意味着你的xml中不存在另一个嵌套层次。这个对象是Books,你想要在那个列表中的元素将有一个简单的Book的相对xpath,这就是你放在那里的东西。