2012-03-21 30 views
2

配列を解析するxmlドキュメントがあります。 どうすればそれらの配列オブジェクトにアクセスして新しい変数に保存できますか? これは、ここで配列オブジェクトを異なる方法で動的にアクセスする方法

<?xml version='1.0'?> 
<document> 
<txtmsg> 
    <smstel>1234567</smstel> 
    <smstxt></smstxt> 
    <smsdir>Send</smsdir> 
    <smstime>06/01/2010 7:54:48 am</smstime> 
</txtmsg> 
<txtmsg> 
    <smstel>33333333</smstel> 
    <smstxt>Test sms hhTes12222222</smstxt> 
    <smsdir>Send</smsdir> 
    <smstime>06/01/2010 7:54:48 am</smstime> 
</txtmsg> 

<Contacts> 
    <conttime>06/01/2010 8:19:05 am</conttime> 
     <cnt> 
      <fn>Abc</fn> 
      <ln>Def</ln> 
      <cnttel>123456</cnttel> 
      <cntmtel>3333333</cntmtel> 
      <cntemail>[email protected]</cntemail> 
     </cnt> 
     <cnt> 
      <fn>def</fn> 
      <ln>ghi</ln> 
      <cnttel>234234</cnttel> 
      <cntmtel>2424</cntmtel> 
      <cntemail>[email protected]</cntemail> 
     </cnt> 
</Contacts> 
</document> 

解析されたXMLであり、これは出力される

$contents = file_get_contents('test.xml'); 
$xml = simplexml_load_string($contents); 
print_r($xml); 

を解析されたPHPコードの一部です。

SimpleXMLElement Object ([txtmsg] => Array ([0] => SimpleXMLElement Object ([smstel] => 1234567 [smstxt] => SimpleXMLElement Object () [smsdir] => Send [smstime] => 06/01/2010 7:54:48 am) [1] => SimpleXMLElement Object ([smstel] => 33333333 [smstxt] => Test sms hhTes12222222 [smsdir] => Send [smstime] => 06/01/2010 7:54:48 am)) [Contacts] => SimpleXMLElement Object ([conttime] => 06/01/2010 8:19:05 am [cnt] => Array ([0] => SimpleXMLElement Object ([fn] => Abc [ln] => Def [cnttel] => 123456 [cntmtel] => 3333333 [cntemail] => [email protected]) [1] => SimpleXMLElement Object ([fn] => def [ln] => ghi [cnttel] => 234234 [cntmtel] => 2424 [cntemail] => [email protected])))) 

どのように私は、個別に、XMLの各要素にアクセスすることができます。.. smstelのような、smstxt、smsdirなど

+1

私は思いますあなたはxpathを見るためにいくつかの時間を費やす必要がありますhttp://www.w3schools.com/xpath/default.asp – CoreCoder

+0

@coreCoderこのような良いリソースを歓迎してくれてありがとう... :) +1 – Natasha

+3

@Natasha beそれを「良いリソース」と呼んでください。http://w3fools.com – Yoshi

答えて

2

を出力を取得します。..

​​
1
echo $xml->txtmsg[0]->smstel; // 1234567 
echo $xml->txtmsg[1]->smstel; // 3333333 
3

たぶん私はそれを簡素化する上だけど、ループ

foreach($xml->txtmsg as $txtmsg) { 
    echo $txtmsg->smstel; 
    echo $txtmsg->smstxt; 
    // more elements... 
} 

注:XMLを使用する場合それは、スキーマを認識するのに役立ちます。上記の例があなたが言及した要素に固有であることを意味します。それにもかかわらず、それはあなたが始めるのを助けるはずです。

+1

このコードはすばらしいです。ありがとうございます。 – Natasha

1
$smsTel = (string) $xml->txtmsg[0]->smstel; // 1234567 

文字通り多次元配列へ<txtmsg>セクションを変換するには、行うことができます:

$array = array(); 
foreach ($xml->txtmsg as $msg) { 
    $array[] = array (
    'smstel' => (string) $msg->smstel, 
    'smstxt' => (string) $msg->smstxt, 
    'smsdir' => (string) $msg->smsdir, 
    'smstime' => (string) $msg->smstime 
); 
} 
print_r($array); 

/* 
    Array 
     (
      [0] => Array 
       (
        [smstel] => 1234567 
        [smstxt] => 
        [smstel] => Send 
        [smstime] => 06/01/2010 7:54:48 am 
      ) 
      [1] => Array 
       (
        [smstel] => 33333333 
        [smstxt] => Test sms hhTes12222222 
        [smstel] => Send 
        [smstime] => 06/01/2010 7:54:48 am 
      ) 
    ) 
*/ 
+0

ありがとう@DaveRandom – Natasha

2

簡単

(string)$xml->txtmsg->smstel 

同じことがのparamsやリスト...そのオブジェクトのプロパティのいずれかのために行きます、または配列

+0

すごく素早く返信..ありがとう。 – Natasha

+0

OPのオブジェクトの場合、これは間違っています。 '$ xml-> txtmsg [0] - > smstel'は正しいです。 –

+0

試しましたか?私がしたから。 PHP 5.3.9(ちょうどその場合) –

1

ここにコードです。 それはあなたがアレイ

function convertXmlObjToArr($obj, &$arr) 
{ 
    $children = $obj->children(); 
    foreach ($children as $elementName => $node) 
    { 
     $nextIdx = count($arr); 
     $arr[$nextIdx] = array(); 
     $arr[$nextIdx]['@name'] = strtolower((string)$elementName); 
     $arr[$nextIdx]['@attributes'] = array(); 
     $attributes = $node->attributes(); 
     foreach ($attributes as $attributeName => $attributeValue) 
     { 
      $attribName = strtolower(trim((string)$attributeName)); 
      $attribVal = trim((string)$attributeValue); 
      $arr[$nextIdx]['@attributes'][$attribName] = $attribVal; 
     } 
     $text = (string)$node; 
     $text = trim($text); 
     if (strlen($text) > 0) 
     { 
      $arr[$nextIdx]['@text'] = $text; 
     } 
     $arr[$nextIdx]['@children'] = array(); 
     convertXmlObjToArr($node, $arr[$nextIdx]['@children']); 
    } 
    return; 
} 

にオブジェクトのSimpleXMLに変換されますが、これは、あなたがそれを行うことができます最善の方法である。この形式で

Array 
(
    @name => books 
    @attributes => array () 
    @children => array 
    (
     array 
     (
      @name => novel 
      @attributes => array (author => John Doe) 
      @children => array 
      (
       array (@name => title, @attributes => array (), @text => John's Novel) 
      ) 
     ) 
    ) 
) 
関連する問題