2017-07-27 123 views
1

使用XmlStringStreamer我有一个XML文件,该文件是这样的XML节点: (文件名:abc.xml)遍历PHP

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

我要存储在一个数据库表中的所有<SItem>(1项纪录对于每个SItem)。我正在使用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并没有从任何论坛得到任何答案,我也试过,但不能得到我想要的话,任何人都可以请帮助我。

非常感谢。

回答

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)之后得到了什么?

对于其他人,我不能添加评论,因此张贴这个答案。

+1

处理我也试过这个在while循环: 的foreach($ simpleXmlNode-> SResponse->正文 - > SResponseDetails-> SItem为$项目) 而我得到的每个节点的XmlObject所以,我将XML转换使用asXML()函数将对象转换为xml,但它将字符转换为小写。 – GoalDone

+1

你能提供$ simpleXmlNode样本值吗?我会看看是否有时间为你验证它? – Star

+0

可以让我知道如何使用asXML()而不用将文本更改为小写。它将xml标签转换为小写。 – GoalDone