0

xmldataに基づいて配列構造を構築しようとしています。問題はImの扱い方に関係していると思います$finalData。最終的には、レコードの3つの配列を含むフラット化された配列が必要ですが、最初にXMLデータを正しく解析してから、データの配列をフラット化する必要があると思います。XMLデータを解析するためにコードを修正したかったので、最初の質問はXMLデータを解析するためにこのコードを修正する方法ですが、その後、最終的なデータ配列をフラット化する方法に取り組みました(個々のrecord構造が必要です)最終的に必要な関連情報が含まれています。ユーザーによるデータのインポートを処理し、最終的にはデータを含む個々のコンポーネントのみを取得しようとしていると言えます。

public function processXml($xmldata,$finalData=array())
{
    $finalData = array();
    if($xmldata instanceof SimpleXMLElement){
        foreach($xmldata as $idata){
            $this->processXml($idata,$finalData);
        }
    } else {
        array_push($finalData,$xmldata);
    }
    return $finalData;  
}

これがXMLデータです(ユーザーがXMLデータに何をインポートするかわからないことに注意してください。これは、私が作成したテストデータです)。

`<?xml version="1.0" encoding="UTF-8"?>
     <configdata>
        <records>
             <somekey>
                <record>
                    <firstname>Jonathan</firstname>
                    <lastname>Kushner</lastname>
                </record>
                <record>
                    <firstname>Dustin</firstname>
                    <lastname>Kushner</lastname>
                </record>
                <record>
                    <firstname>Cameron</firstname>
                    <lastname>Kushner</lastname>
                </record>
            </somekey>
        </records>
    </configdata>`

注:提供される回答は、xpathとdomdocumentを使用しています。私は再帰と平坦化を学ぼうとしているので、それはより良いアプローチですが、再帰と平坦化だけを使用してこれを実装する方法を理解したいと思います。

4

1 に答える 1

0

再帰ループのカーペット爆弾アプローチよりも、XPathを使用して必要なデータのみを正確に抽出する方がはるかに優れています。

あなたが望むものを達成する方法は次のとおりです。

// Create the document object
$xml = simplexml_load_string($xmlData);

$result = array();

// Get the <record> nodes and loop them
foreach ($xml->xpath('//record') as $record) {
    // to get the text data from a node in SimpleXML, just cast it to a string
    $result[] = array(
        'firstname' => (string) $record->firstname,
        'lastname' => (string) $record->lastname,
    );
}

print_r($result);

動いているのを見る

$record名前を知らずにからすべての子要素を取得するには、次を使用できます。

$result[] = array_map(
    'strval', 
     iterator_to_array($record->children())
);

同じ名前の要素 (XML では可能) は配列では機能しないことに注意してください。ここでは、同じ名前を持つ最後の要素だけが残ります。

編集

これは XPath でも実行できますが、SimpleXML の代わりに DOM を使用する必要があります (これは問題にはなりません。どこでも使用できます)。次のようなことができます。

// Create the document object
$doc = new DOMDocument;

// This is required in order to ignore the pretty-print whitspace
$doc->preserveWhiteSpace = false;

// load the data into the object
$doc->loadXML($xmlData);
$xpath = new DOMXpath($doc);

$result = array();

// Get the text nodes and loop them
foreach ($xpath->query('//text()') as $record) {
    $result[] = $record->data;
}

print_r($result);

動いているのを見る

于 2013-03-15T16:42:21.880 に答える