2012-10-04 43 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

知道了 - 检查编辑:-) –

相关问题