2016-09-29 22 views
2

私は現在、$tablesという配列を作るのにこれをやっていますが、もっと簡単な方法があるのでしょうか?複数の要素を一度に選択するXPath?

$tables = array(); 
$abbr = $states_xml->xpath('//StateAbbr'); 
$names = $states_xml->xpath('//StateName'); 

// State Abbreviations... 
while(list($key,$table) = each($abbr)) { 
    $tables[$key]['Abbr'] = (string) trim($table); 
} 

// State Names... 
while(list($key,$name) = each($names)) { 
    $tables[$key]['Name'] = (string) trim($name); 
} 

それは1、外出先でのStateAbbrStateName要素を呼び出し、$tablesがあるとして、それらが同じ形式の配列で出力することは可能ですか?私は$states_xmlにXMLをロードする$states_xml = simplexml_load_string(THE STRING ABOVE);を使用しています

<diffgr:diffgram 
    xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 
    xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> 
    <NewDataSet 
     xmlns=""> 
     <Table diffgr:id="Table1" msdata:rowOrder="0"> 
      <StateAbbr>AL </StateAbbr> 
      <StateName>Alabama</StateName> 
     </Table> 
     <Table diffgr:id="Table2" msdata:rowOrder="1"> 
      <StateAbbr>AK </StateAbbr> 
      <StateName>Alaska</StateName> 
     </Table> 
     <Table diffgr:id="Table3" msdata:rowOrder="2"> 
      <StateAbbr>AS </StateAbbr> 
      <StateName>American Samoa</StateName> 
     </Table> 
     <Table diffgr:id="Table4" msdata:rowOrder="3"> 
      <StateAbbr>AP </StateAbbr> 
      <StateName>AP</StateName> 
     </Table> 
     ... 
    </NewDataSet> 
</diffgr:diffgram> 

array(57) { 
    [0]=> 
    array(2) { 
    ["Abbr"]=> 
    string(2) "AL" 
    ["Name"]=> 
    string(7) "Alabama" 
    } 
    [1]=> 
    array(2) { 
    ["Abbr"]=> 
    string(2) "AK" 
    ["Name"]=> 
    string(6) "Alaska" 
    } 
    [2]=> 
    array(2) { 
    ["Abbr"]=> 
    string(2) "AS" 
    ["Name"]=> 
    string(14) "American Samoa" 
    } 
... and so on... 

基本的には、$states_xmlは次のようになります。

ので、テーブルの列は次のようになります。

とにかく、StateAbbrStateNameのすべてをTableの要素からまとめて出力することはできますか?私には可能ですが、私が現在やっているやり方以外にこれにアプローチする方法がわかりません。

答えて

0

array_merge_recursiveを使用して、これを試してください。

$abbr = $states_xml->xpath('//StateAbbr'); 
$names = $states_xml->xpath('//StateName'); 
$tables = array_merge_recursive($abbr, $names); 

表示:

print_r($tables); 
0

はい、この単一のXPath、

//*[self::StateAbbr or self::StateName] 

は、XML文書内のすべてのStateAbbrStateNameの要素を返します。 。

+0

いいえ、それは残念なことには機能しません。私はXML文字列の出力で質問を更新しました。 –

+0

まあ、それは何をするように設計されています:すべての 'StateAbbr'と' StateName'要素を単一のXPathで選択します。あなたが実際に 'StateAbbr'と' StateName'要素の間の関連付けを保持したいのであれば、なぜすべてのテーブルを選択しないのですか?例: '// Table' – kjhughes

+0

'// Table'は情報をあまりにも多く返し、簡単に解析できないためです。いずれにせよ、 '$ states = json_decode(json_encode($ states_xml)、true);'を実行するだけで済むようになりました。 NewDataSet '] [' Table '] 'それは私に必要なものを与えます。あなたの助けてくれてありがとう。 :) –

0

親要素ノードを反復処理する必要があります。式はのSimpleXMLElementを表すノードに関連しているが、それはあなたのケースで必要とされない:

$diffgram = new SimpleXMLElement($xml); 

$result = []; 
foreach($diffgram->xpath('.//Table') as $table) { 
    $result[] = [ 
    'Abbr' => trim($table->StateAbbr), 
    'Name' => trim($table->StateName) 
    ]; 
} 

var_dump($result); 

出力:DOMで

array(4) { 
    [0]=> 
    array(2) { 
    ["Abbr"]=> 
    string(2) "AL" 
    ["Name"]=> 
    string(7) "Alabama" 
    } 
    [1]=> 
    array(2) { 
    ["Abbr"]=> 
    string(2) "AK" 
    ["Name"]=> 
    string(6) "Alaska" 
    } 
    [2]=> 
    array(2) { 
    ["Abbr"]=> 
    string(2) "AS" 
    ["Name"]=> 
    string(14) "American Samoa" 
    } 
    [3]=> 
    array(2) { 
    ["Abbr"]=> 
    string(2) "AP" 
    ["Name"]=> 
    string(2) "AP" 
    } 
} 

それはほとんど同じに見えますが、ここであなたは、XPath式を必要とします詳細は

$document = new DOMDocument(); 
$document->loadXml($xml); 
$xpath = new DOMXpath($document); 

$result = []; 
foreach($xpath->evaluate('.//Table') as $table) { 
    $result[] = [ 
    'Abbr' => $xpath->evaluate('normalize-space(StateAbbr)', $table), 
    'Name' => $xpath->evaluate('normalize-space(StateName)', $table) 
    ]; 
} 

var_dump($result); 
関連する問題