PHP函数比较XML元素的相等性

时间:2012-11-12 04:17:58

标签: php xml

我有一个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>

我想创建一个php文件来检索Contact中的FullName和PhoneNumbers中的值,其中Contact / Id与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 ++联系人。我只是想要一些帮助来产生一个功能或什么东西来输出我已经拥有他们的电话号码的联系人。

感谢任何帮助。

谢谢

1 个答案:

答案 0 :(得分: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);

?>