2017-07-27 113 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