2012-10-04 75 views
-2

可能重複:
Implementing condition in XPath and XQuery
PHP convert XML to JSONPHP,XML獲取記錄節點和值並將它們放入JSON數組中?

我如何獲得所有子筆記,其中包括產品=產品1 並把它們放到一個JSON數組的記錄?

<RECORD> 
<PROP NAME="Product"> 
<PVAL><!CDATA[Produkt1]]</PVAL> 
<PROP NAME="Value"> 
<PVAL><!CDATA[10]]</PVAL> 
<PROP NAME="Status"> 
<PVAL><!CDATA[Active]]</PVAL> 
</RECORD> 
<RECORD> 
<PROP NAME="Product"> 
<PVAL><!CDATA[Produkt2]]</PVAL> 
<PROP NAME="Value"> 
<PVAL><!CDATA[20]]</PVAL> 
<PROP NAME="Status"> 
<PVAL><!CDATA[Active]]</PVAL> 
</RECORD> 
<RECORD> 
<PROP NAME="Product"> 
<PVAL><!CDATA[Produkt3]]</PVAL> 
<PROP NAME="Value"> 
<PVAL><!CDATA[30]]</PVAL> 
<PROP NAME="Status"> 
<PVAL><!CDATA[Active]]</PVAL> 
</RECORD> 

我需要一個iPad應用程序中的數據,稱像www.products.com/product.php?Product1

具有JSON看起來像

{ 
"Product": [ 
{ "Name":"Product1" , "Value":"10" , "Status":"Active" } 
] 
} 

編輯:解決方案使用XML閱讀器

<?php 
$z = new XMLReader; 
$z->open('products.xml'); 

$doc = new DOMDocument; 

// move to the first <product /> node 
while ($z->read() && $z->name !== 'RECORD'); 

// now that we're at the right depth, hop to the next <product/> until the end of the tree 
while ($z->name === 'RECORD') 
{ 

    $node = simplexml_import_dom($doc->importNode($z->expand(), true)); 


    $strvalue = $node->PROP[6]->PVAL; 
    echo $strvalue."<p>" ; 

    // go to next <product /> 
    $z->next('RECORD'); 
} 
?> 
+0

有沒有像'JSON array'。你的意思是json格式化的字符串? – Leri

+0

對我而言有一種叫做JSON數組的東西,但是是真的 - 它是由JSON字符串/對象組成的 http://www.w3schools.com/json/json_syntax.asp –

+0

這是無效的XML –

回答

1

首先,看看你的XML讓我很頭疼。下面是你需要做一些修改:

  1. 如果你將有多個節點,那麼你需要的包裝,如之前的所有節點畢竟他們。
  2. 你PROP節點需要關閉標籤
  3. 你CDATA被misformatted,正確的格式爲

這是我的新格式的XML的例子:

<?xml version='1.0'?> 
<RECORDS> 
    <RECORD> 
    <PROP NAME="Product"> 
     <PVAL><![CDATA[Produkt1]]></PVAL> 
    </PROP> 
    <PROP NAME="Value"> 
     <PVAL><![CDATA[10]]></PVAL> 
    </PROP> 
    <PROP NAME="Status"> 
     <PVAL><![CDATA[Active]]></PVAL> 
    </PROP> 
</RECORD> 
<RECORD> 
    <PROP NAME="Product"> 
     <PVAL><![CDATA[Produkt2]]></PVAL> 
    </PROP> 
    <PROP NAME="Value"> 
     <PVAL><![CDATA[20]]></PVAL> 
    </PROP> 
    <PROP NAME="Status"> 
     <PVAL><![CDATA[Active]]></PVAL> 
    </PROP> 
</RECORD> 
<RECORD> 
    <PROP NAME="Product"> 
     <PVAL><![CDATA[Produkt3]]></PVAL> 
    </PROP> 
    <PROP NAME="Value"> 
     <PVAL><![CDATA[30]]></PVAL> 
    </PROP> 
    <PROP NAME="Status"> 
     <PVAL><![CDATA[Active]]></PVAL> 
    </PROP> 
</RECORD> 

一旦XML格式正確,我會用SimpleXML來解析它:

$xml = simplexml_load_string($xml_string); 
foreach ($xml->RECORD as $record) 
{ 
    if ($record->PROP[0]->PVAL == 'Produkt1') 
    { 
     echo json_encode($record); 
    } 
} 

我也認爲你可以從重構整個XML真正受益。喜歡的東西:

<RECORDS> 
    <RECORD ID="1"> 
     <PRODUCT>PRODUCT 1</PRODUCT> 
     <VALUE>10</VALUE> 
     <STATUS>Active</STATUS> 
    </RECORD> 
    <RECORD ID="2"> 
     <PRODUCT>PRODUCT 2</PRODUCT> 
     <VALUE>20</VALUE> 
     <STATUS>Active</STATUS> 
    </RECORD> 
    <RECORD ID="3"> 
     <PRODUCT>PRODUCT 3</PRODUCT> 
     <VALUE>30</VALUE> 
     <STATUS>Active</STATUS> 
    </RECORD> 
</RECORDS> 

所以那麼PHP會是這樣:

foreach ($xml->RECORD as $record) 
{ 
    $attr = $record->attributes(); 
    if($attr['ID'] == '1') 
    { 
     echo json_encode($record); 
    } 
} 
+0

非常感謝一個建設性的答案:-) 不幸的是我不是一個製作XML文件的人,我剛纔被告知要拖出信息。 我會做我自己的例子,並使用你的代碼讓他改變的事情。 我將在以後測試 - 感謝百萬:-D –

+0

hmn .....我肯定在正確的軌道上。當我創建一個「小」測試文件時,一切都按計劃運行。然而,我的XML文件是100 MB,所以我想我應該使用XMLreader而不是SimpleXML。任何人都可以給我一點幫助?寫Jason的代碼爲xmlreader? –

+0

知道了 - 檢查編輯:-) –

相關問題