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

时间:2017-07-27 13:42:18

标签: php xml

我有一个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并且没有从任何论坛得到任何答案,我也试过但是无法得到我想要的,有人可以帮助我。

非常感谢。

2 个答案:

答案 0 :(得分: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>。那么,有人对这个问题有所了解吗?

答案 1 :(得分:0)

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

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