如何在GO中解析巨大的xml忽略嵌套元素?

时间:2017-08-14 20:24:36

标签: xml go xml-parsing

我有这个XML,例如:

> aggregate(. ~ Species, data = iris, mean)
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa        5.006       3.428        1.462       0.246
2 versicolor        5.936       2.770        4.260       1.326
3  virginica        6.588       2.974        5.552       2.026

> aggregate(. ~ Species, data = iris, median)
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa          5.0         3.4         1.50         0.2
2 versicolor          5.9         2.8         4.35         1.3
3  virginica          6.5         3.0         5.55         2.0

我正在用encode / xml解析它:

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

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

我不确定这是否是最佳方式,我不知道解码器.DecodeElement(...)是否忽略了我不想要的嵌套元素解析。我想以较低的内存成本提高性能。解析这些巨大的XML文件的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

通常最好将XML解码器用于大型XML,它使用流和Go选择性绑定(如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