2012-11-12 61 views
0

我有一個XML文件,應該是我的手機通訊錄備份,我試圖創建一個PHP文件來檢索只有分配給他們的電話號碼的聯繫人。該文件包含不同應用程序的聯繫人。PHP函數來比較XML元素的相等性

的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>[email protected]</AccountName> 
    <AccountType>com.htc.socialnetwork.facebook</AccountType> 
    </Contact> 

我希望做一個PHP文件,將檢索聯繫全名,並從PHONENUMBERS在接觸/標識的PHONENUMBERS匹配/的ContactID價值。

我建立這個代碼:

<?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 ++聯繫人。我只是想要一些幫助產生一個功能或某些東西只輸出我已經有他們的電話號碼的聯繫人。

任何幫助表示讚賞。

謝謝

+0

如果需要任何額外的信息,請諮詢 – Mariposa

回答

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); 

?> 
+0

謝謝回覆。 我用你的代碼,當我加載我的PHP文件它出現此錯誤: 致命錯誤:類'XSLTProcessor'找不到/contact/newcontact.php在第4行' – Mariposa

+0

是否有可能修改XML文件? –

+0

是的,但它的巨大,這就是爲什麼我想創建一個函數或東西 – Mariposa