-2

可能重复:
在 XPath 和 XQuery
PHP 中实现条件将 XML 转换为 JSON

如何从包含 Product = Product1 的记录中获取所有子注释并将它们放入 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');
}
?>
4

1 回答 1

1

首先,仅查看您的 XML 就让我头疼。以下是您需要进行的一些更改:

  1. 如果您将有多个节点,那么您需要一个包装器,例如在所有节点之前和所有节点之后。
  2. 你的 PROP 节点需要一个结束标签
  3. 您的 CDATA 格式错误,正确的格式是

这是我新格式化的 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 );
    }
}
于 2012-10-04T14:01:39.277 回答