-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>

www.products.com/product.php?Product1のようなものを呼び出すiPadアプリのデータが必要です

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 に答える