Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在忽略嵌套元素的情况下解析巨大的xml?_Xml_Go_Xml Parsing - Fatal编程技术网

如何在忽略嵌套元素的情况下解析巨大的xml?

如何在忽略嵌套元素的情况下解析巨大的xml?,xml,go,xml-parsing,Xml,Go,Xml Parsing,我有这样的XML,例如: <Report> ... <ElementOne Blah="bleh"> <IgnoreElement> <Foo> ... </Foo> </IgnoreElement> <

我有这样的XML,例如:

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

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

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

通常最好对大型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>

播放链接:

通常最好对大型XML使用XML解码器,它使用流并使用选择性绑定,如WANTthiseelement>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>

播放链接:

通常,将大型xml解析为流的最佳方法是使用xml.Decoder和Token/RawToken函数。这相当于大量的代码,但是如果你有,比如说wikipedia转储的5GB XML流,效率会更高。是的,我看过一篇文章:这解释了这一点,但在这种情况下,元素很小,没有那么多被忽略的元素。在我的例子中,IgnoreElement非常大,我想知道xml.Decoder是否能够很好地完成这项工作。即使IgnoreElement很大,您也可以通过输入进行处理,直到最终获得结束标记标记。但是当我调用DecodeElement时,我使用ElementOne作为起始元素,因为我需要Blah属性。我认为在这种情况下,DecodeElement就像解组器一般,将大型xml解析为流的最佳方法是使用xml.Decoder和Token/RawToken函数。这相当于大量的代码,但是如果你有,比如说wikipedia转储的5GB XML流,效率会更高。是的,我看过一篇文章:这解释了这一点,但在这种情况下,元素很小,没有那么多被忽略的元素。在我的例子中,IgnoreElement非常大,我想知道xml.Decoder是否能够很好地完成这项工作。即使IgnoreElement很大,您也可以通过输入进行处理,直到最终获得结束标记标记。但是当我调用DecodeElement时,我使用ElementOne作为起始元素,因为我需要Blah属性。我认为在这种情况下,decodelement就像解组一样,对于大型XML,解组速度不是很慢吗?使用DecodeElement有什么好处?我已经更新了链接,很抱歉之前的链接不正确。对于大型XML,解组不是很慢吗?使用DecodeElement有什么好处?我已经更新了链接,很抱歉之前的链接不正确。
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"`
}