2017-08-14 65 views
0

我有這樣的XML,例如:如何在GO中解析巨大的XML忽略嵌套元素?

 <Report> 
     ... 
     <ElementOne Blah="bleh"> 
      <IgnoreElement> 
       <Foo> 
        ... 
       </Foo> 
      </IgnoreElement> 

      <WantThisElement> 
       <Bar Baz="test"> 
        ... 
       </Bar> 
       <Bar Baz="test2"> 
        ... 
       </Bar> 
      </WantThisElement> 
     </ElementOne> 
     ... 
    </Report> 

而且我解析這個與編碼/ XML:

... 
    decoder := xml.NewDecoder(resp.Body) 
    Mystruct := MyStruct{} 
    for { 
    t, _ := decoder.Token() 

    if t == nil { 
     break 
    } 
    switch se := t.(type) { 
    case xml.StartElement: 
     if se.Name.Local == "ElementOne" { 
      decoder.DecodeElement(&Mystruct, &se) 
     } 
    } 
    ... 



    type MyStruct struct{ 
     Blah string 
     Bar []Bar 
    } 
    type Bar struct{ 
     Baz string 
     ... 
    } 

我不知道這是否是做的最好的方式我不知道decode.DecodeElement(...)是否忽略了我不想分析的嵌套元素。我想以低內存成本提高性能。什麼是解析這些巨大的XML文件的最佳方式?

+0

一般解析大個XML作爲數據流是使用'xml.Decoder'的最佳途徑,令牌/ RawToken功能。它相當於很多代碼,但如果你有,比如來自維基百科轉儲的5GB XML流,效率會更高。 –

+0

是的,我看到的一篇文章:http://blog.davidsingleton.org/parsing-huge-xml-files-with-go/解釋這一點,但在這種情況下,元素小,沒有那麼多忽略元素。在我的情況下,IgnoreElement非常龐大,我想知道xml.Decoder是否可以做到這一點。 – Vivi

+0

即使'IgnoreElement'很大,你可以通過輸入燃燒,直到你終於結束標記令牌。 – RayfenWindspear

回答

1

通常最好是使用XML解碼器,用於大型XML,它採用了流和具有選擇性結合進入(如WantThisElement>Bar)然後XML解碼器遵循的路徑。從你的問題

讓我們使用XML內容,以創建一個實例。

XML內容:

<Report> 
    <ElementOne Blah="bleh"> 
     <IgnoreElement> 
      <Foo> 
       <FooValue>example foo value</FooValue> 
      </Foo> 
     </IgnoreElement> 

     <WantThisElement> 
      <Bar Baz="test"> 
       <BarValue>example bar value 1</BarValue> 
      </Bar> 
      <Bar Baz="test2"> 
       <BarValue>example bar value 2</BarValue> 
      </Bar> 
     </WantThisElement> 
    </ElementOne> 
</Report> 

結構:

type Report struct { 
    XMLName xml.Name `xml:"Report"` 
    ElementOne ElementOne 
} 

type ElementOne struct { 
    XMLName xml.Name `xml:"ElementOne"` 
    Blah string `xml:"Blah,attr"` 
    Bar  []Bar `xml:"WantThisElement>Bar"` 
} 

type Bar struct { 
    XMLName xml.Name `xml:"Bar"` 
    Baz  string `xml:"Baz,attr"` 
    BarValue string `xml:"BarValue"` 
} 

播放鏈接:https://play.golang.org/p/26xDkojeUp

+0

是不是解組鉅額個XML慢?使用DecodeElement有什麼好處? – Vivi

+0

我已經更新了鏈接,很抱歉前面有不正確的鏈接。 – jeevatkm