0

電話の連絡先のバックアップとなる XML ファイルがあり、電話番号が割り当てられている連絡先のみを取得するための php ファイルを作成しようとしています。ファイルには、さまざまなアプリケーションからの連絡先が含まれています。

XML には次の要素があります。

<Contact>
    <Id>5238</Id>
    <GivenName>friend1</GivenName>
    <FullName>friendA</FullName>
    <CreateTime>0001-01-01T00:00:00+00:00</CreateTime>
    <ModifyTime>0001-01-01T00:00:00+00:00</ModifyTime>
    <Starred>false</Starred>
    <AccountName>SIM</AccountName>
    <AccountType>com.anddroid.contacts.sim</AccountType>
  </Contact>

<PhoneNumbers>
    <Id>53</Id>
    <ContactId>1380</ContactId>
    <Name>2</Name>
    <Value>07123456789</Value>
    <Primary>2</Primary>
  </PhoneNumbers>

<Contact>
    <Id>328</Id>
    <FamilyName>tee</FamilyName>
    <GivenName>friend2</GivenName>
    <FullName>friend2 tee</FullName>
    <CreateTime>0001-01-01T00:00:00+00:00</CreateTime>
    <ModifyTime>0001-01-01T00:00:00+00:00</ModifyTime>
    <Picture>18948</Picture>
    <Starred>false</Starred>
    <AccountName>xxxxxxx@hotmail.com</AccountName>
    <AccountType>com.htc.socialnetwork.facebook</AccountType>
  </Contact>

そして、Contact から FullName を取得し、Contact/Id が PhoneNumbers/ContactId と一致する PhoneNumbers から Value を取得する php ファイルを作成したいと考えています。

このコードを作成しました:

<?php
$xml = simplexml_load_file("Contact.xml");

$i=0;
$k=0;
foreach ($xml->Contact as $contact) {
    if ($contact->AccountName == "SIM"){

   echo "Contact:   " . $k . "<br />   "; echo $contact->nodeValue[$k] . "<br />   " . $contact->FullName . "<br />   ";
   $k++;
   }
   }
   foreach ($xml->PhoneNumbers as $number) {

    echo "Contact:   " . $i . "<br />   "; echo  $number->Value . "<br />   ";
   $i++;
    }

?>

53 の連絡先と 173 の番号を出力します。入れないとif ($contact->AccountName == "SIM")、同じ番号が出力されますが、700 ++の連絡先が出力されます。すでに電話番号を持っている連絡先のみを出力する関数または何かを作成するのに助けが欲しいだけです。

どんな助けでも大歓迎です。

ありがとうございました

4

1 に答える 1

0

XSL スタイルシートを使用することをお勧めします。

<xsl:stylesheet version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

<xsl:template match="/">
  <ul><xsl:apply-templates/></ul>
</xsl:template>

<xsl:template match="Contact"> 
  <!-- select phonenumbers with the matching ContactId -->
  <xsl:variable name="numbers" select="//PhoneNumbers[ContactId=current()/Id]"/>

  <!-- when any matching  PhoneNumber has been found, continue -->
  <xsl:if test="count($numbers) &gt; 0">
  <li>
    <xsl:value-of select="FullName"/>
    <ul>
      <!-- call a named template with the matching PhoneNumbers as param -->
      <xsl:call-template name="printNumbers">
        <xsl:with-param name="numbers" select="$numbers" />
      </xsl:call-template>
    </ul>
  </li>
  </xsl:if>
</xsl:template>

<xsl:template name="printNumbers">
  <xsl:param name="numbers" />
  <!-- loop through PhoneNumbers and print the Value -->
  <xsl:for-each select="$numbers">
    <li><xsl:value-of select="Value" /></li>
  </xsl:for-each>
</xsl:template>

<xsl:template match="PhoneNumbers"/>
</xsl:stylesheet> 

スタイルシートの使用方法:

<?php

$doc = new DOMDocument();
$xsl = new XSLTProcessor();

$doc->load('path/to/stylesheet.xsl');
$xsl->importStyleSheet($doc);

$doc->load('Contact.xml');
echo $xsl->transformToXML($doc);

?>
于 2012-11-12T21:48:25.653 に答える