使用PHP中的XmlStringStreamer循环遍历XML节点

问题描述 投票:1回答:2

我有一个XML文件,如下所示:(fileName:abc.xml)

<Envelope>
    <Body>
        <SResponse>
            <Body>
                <SResponseDetails>
                    <SItem>...</SItem>
                    <SItem>...</SItem>
                    <SItem>...</SItem>
                    <SItem>...</SItem>
                </SResponseDetails>
            </Body>
        </SResponse>
    </Body>
</Envelope>

我想将所有<SItem>存储在db表中(每个SItem有1条记录)。我正在使用PHP并使用XmlStringStreamer。

这是我读取此文件并进行处理的代码。

$streamer = \Prewk\XmlStringStreamer::createStringWalkerParser(__DIR__ . "/tempFile.xml");
$stream = new Stream\File(__DIR__ . "/abc.xml", 1024);
$parser = new Parser\StringWalker();
$streamer = new XmlStringStreamer($parser, $stream);
while ($node = $streamer->getNode()) {
    $simpleXmlNode = simplexml_load_string($node);
    //-- code here for getting single node
}

我正在使用XmlStringStreamer,并没有从任何论坛得到任何答案,我也尝试但无法得到我想要的,所以有人可以帮助我。

非常感谢。

php xml
2个回答
1
投票

我已经解决了,这是我的答案。对于特定项的循环,我们可以直接在xmlStringSteamer中使用它:

$stream = new Stream\File(__DIR__ . "/abc.xml", 1024);
$options = array(
    "uniqueNode" => "SItem"
);
$parser = new Parser\UniqueNode($options);

// Create the streamer
$streamer = new XmlStringStreamer($parser, $stream);

$countNodes = 0;
while ($node = $streamer->getNode())
{
    print_r($node);
}

唯一的问题是它将xml标记转换为小写。像<SItem>成为<sitem>。那么,有谁知道这个问题?


0
投票

我没有执行你的代码,但我认为你可以使用PHP逻辑。如果有什么不适合你,那么最后的解决方案将爆炸$simpleXmlNode以获得一些数组结构,然后根据您的需要处理它。顺便问一下你能分享你在$simpleXmlNode = simplexml_load_string($node)之后得到的东西吗?

对于其他人,我无法添加评论,因此将此作为答案发布。

© www.soinside.com 2019 - 2024. All rights reserved.