如何在GO中解码灵活的xml?

时间:2017-08-21 18:34:35

标签: xml go xml-parsing

我有以下xml:

    ...
    <solution>
      <ContainerBlockElement>
        <Paragraph>
           <Paragraph>
              Foo
           </Paragraph>
           <Paragraph>
              bar
           </Paragraph>
       </Paragraph>
     </ContainerBlockElement>
   </solution>
   ...

我想提取内容,但问题是:服务器可以向我发送第二个结构:

    ...
    <solution>
      <ContainerBlockElement>
        <Paragraph>
          baz
        </Paragraph>
      </ContainerBlockElement>
    </solution>
    ...

我尝试使用这个结构去解码,但它不起作用:

       type Blah struct {
           ...
    Solutions           []string     `xml:"solution>ContainerBlockElement>Paragraph"`
    Solutions2Paragraph []string         `xml:"solution>ContainerBlockElement>Paragraph>Paragraph"`

}

我该如何解码?

1 个答案:

答案 0 :(得分:3)

对于不可预测的结构,反序列化为结构不起作用。相反,您最好使用xml.Decoder.Token使用XML解析器的流模式按顺序解析元素并根据需要处理它们。

decoder := xml.NewDecoder(xmlFile) 
solutions := make([]string,0,0)

for { 
    t, _ := decoder.Token() 
    if t == nil { 
        break 
    }
    switch se := t.(type) { 
    case xml.StartElement: 
        if se.Name.Local == "Paragraph" {
            // Get the next token after the Paragraph start element, which will be the tag contents
            innerText,ok := decoder.Token().(xml.CharData)
            if !ok {
                continue
            }
            solutions = append(solutions, string(innerText))
        }
    }
}

此代码未经测试,但应提供一个不错的起点。