3

「Komponist」や「Künstler」などの「役割」情報を失うことなく、Simplexmlを使用して応答のXML部分を解析しようとしています。

<itemattributes xml:lang="de-DE" xmlns:ns2="http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd">
<ns2:binding>Audio CD</ns2:binding>
<ns2:brand>MEYER,SABINE/VARIOUS</ns2:brand>
<ns2:creator role="Künstler">Meyer,Sabine</ns2:creator>
<ns2:creator role="Künstler">Various</ns2:creator>
<ns2:creator role="Komponist">Mozart</ns2:creator>
<ns2:creator role="Komponist">Stamitz</ns2:creator>
<ns2:creator role="Komponist">Weber</ns2:creator>
<ns2:creator role="Komponist">Krommer</ns2:creator>
</ns2:itemattributes>

私はこれを試しました:

    $nodeList = $attributeSets->getAny();
    foreach ($nodeList as $domNode){
        $domDocument =  new DOMDocument();
        $domDocument->preserveWhiteSpace = false;
        $domDocument->formatOutput = true;
        $xmlData = $domDocument->saveXML($domDocument->importNode($domNode,true));

    }
    //$xmlData  = str_replace("ns2:", "", $xmlData);
    $xmlData = new SimpleXMLElement($xmlData);

しかし、ns2属性を置き換えないと、xmlを解析できません。そして、行のコメントを外すと、役割の属性はなくなります。

SimpleXMLElement Object
(
    [Binding] => Audio CD
    [Brand] => MEYER,SABINE/VARIOUS
    [Creator] => Array
    (
        [0] => Meyer,Sabine
        [1] => Various
        [2] => Mozart
        [3] => Stamitz
        [4] => Weber
        [5] => Krommer
    )
)

これらの属性をどのように保持できるか、そして最終的にはXML全体を連想配列にする方法を知りたいと思います。

4

2 に答える 2

2

解決策は次のとおりです。

$attributeSets = $product->getAttributeSets();
if ($attributeSets->isSetAny()){
$nodeList = $attributeSets->getAny();
$xmlData =  getXMLData($nodeList);
foreach ($xmlData as $node) {
         foreach($node->attributes() as $name => $value) {
             if($node->getName() == "Creator")
             {
                 $array['Creator'][] = array(
                     "name" => $node,
                     "role" => $value
                 );
             }
         }
     }

}

function getXMLData($nodeList)
{
    foreach ($nodeList as $domNode){
        $domDocument = new DOMDocument;
        $domDocument->preserveWhiteSpace = false;
        $domDocument->formatOutput = true;
        $xml = $domDocument->saveXML($domDocument->importNode($domNode,true));
    }
    return new SimpleXMLElement($xml, false, false, 'ns2', true);
}

また、エンコーディングも非常に重要です。isoエンコーディングとumlautsに問題がありました。そのため、SimpleXMLElementコンストラクターがクラッシュしました...

于 2012-12-21T09:28:18.740 に答える
1

名前空間を含めるように最初の行を修正してください。

$xml = <<< XML
<ns2:itemattributes xml:lang="de-DE" xmlns:ns2="http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd">
 <ns2:binding>Audio CD</ns2:binding>
 <ns2:brand>MEYER,SABINE/VARIOUS</ns2:brand>
 <ns2:creator role="Künstler">Meyer,Sabine</ns2:creator>
 <ns2:creator role="Künstler">Various</ns2:creator>
 <ns2:creator role="Komponist">Mozart</ns2:creator>
 <ns2:creator role="Komponist">Stamitz</ns2:creator>
 <ns2:creator role="Komponist">Weber</ns2:creator>
 <ns2:creator role="Komponist">Krommer</ns2:creator>
</ns2:itemattributes>
XML;

次に、以下を実行してロール属性を取得します。

DOMを使用

$dom = new DOMDocument;
$dom->loadXML($xml);
foreach ($dom->getElementsByTagName('creator') as $creator) {
    printf(
        'Role: %s - Value: %s%s',
        $creator->getAttribute('role'),
        $creator->nodeValue,
        PHP_EOL
    );
}

SimpleXmlを使用

$itemAttributes = new SimpleXMLElement($xml, null, false, 'ns2', true);
foreach ($itemAttributes->creator as $creator) {
    $attributes = $creator->attributes();
    printf(
        'Role: %s - Value: %s%s',
        $attributes['role'],
        $creator,
        PHP_EOL
    );
}
于 2012-12-19T09:28:31.433 に答える