2012-08-23 32 views
4

迭代鉴于类似以下内容的XML块:通过XML中去

<data> 
    <entry> 
    ... several nested elements 
    </entry> 
    <entry> 
    ... more nested elements 
    </entry> 
</data> 

我如何可以遍历文档中的每个<entry>元素,并把它变成一个结构来移动之前对其执行一些操作到下一个入口?

我已经能够解析数据并将数据存储到XML块中的结构中,如上所述,其中只有一个<entry>元素存在。也就是说,我能够成功地这样的事情存储到一个结构:

<entry> 
    ... several nested elements 
</entry> 

回答

10

解析xmml文件,直到你到达entry元素是一种方法:

xmlFile, err := os.Open(filename) 
    if err != nil { 
    log.Fatal(err) 
} 
defer xmlFile.Close() 
decoder := xml.NewDecoder(xmlFile) 
total := 0 
for { 
    token, _ := decoder.Token() 
    if token == nil { 
     break 
    } 
    switch startElement := token.(type) { 
     case xml.StartElement: 
     if startElement.Name.Local == "entry" { 
      // do what you need to do for each entry below 
     } 
    } 
} 
+0

开关块需要在里面的for循环。 – jdc

+0

@jdc true,我编辑了答案。 – VonC

7

下面是我倒是这样做,每文档和例子在http://golang.org/pkg/encoding/xml/

package main 

import (
    "encoding/xml" 
    "log" 
) 

// Represents a <data> element 
type Data struct { 
    XMLName xml.Name `xml:"data"` 
    Entry []Entry `xml:"entry"` 
} 

// Represents an <entry> element 
type Entry struct { 
    Name string `xml:"name"` 
    Age int `xml:"age"` 
} 

// Test data 
var testXML string = ` 
<data> 
    <entry> 
     <name>John Doe</name> 
     <age>28</age> 
    </entry> 
    <entry> 
     <name>Jane Doe</name> 
     <age>29</age> 
    </entry> 
    <entry> 
     <name>Bob Doe</name> 
     <age>30</age> 
    </entry> 
    <entry> 
     <name>Beth Doe</name> 
     <age>31</age> 
    </entry> 
</data> 
` 

func main() { 

    data := &Data{} 

    err := xml.Unmarshal([]byte(testXML), data) 
    if err != nil { 
     log.Fatal(err) 
    } 

    for i := 0; i < len(data.Entry); i++ { 
     log.Printf("%#v", data.Entry[i]) 
    } 
} 

输出是:

main.Entry{Name:"John Doe", Age:28} 
main.Entry{Name:"Jane Doe", Age:29} 
main.Entry{Name:"Bob Doe", Age:30} 
main.Entry{Name:"Beth Doe", Age:31} 
+0

如果您不是只使用'entry'标签,而可以使用两种或更多类型的标签,您将如何做到这一点?例如每个元素,可能是一个'入口'或'记录'或类似的东西,其中秩序仍然很重要 –

+0

我打开了第二个问题值得50赏金点http://stackoverflow.com/questions/19078977/can-i -use-GOS-XML的和解组换有序多态类型 –

0

只要确保你处理EOF正确

for { 
    // Read tokens from the XML document in a stream. 
    t, err := decoder.Token() 
    if t == nil { 
     if err == nil { 
      continue 
     } 
     if err == io.EOF { 
      break 
     } 
     log.Fatal(err) 
    } 

    //... 
}