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>

我想制作一个 php 文件,该文件将从联系人中检索 FullName,并从联系人/Id 与 PhoneNumbers/ContactId 匹配的 PhoneNumbers 中检索值。

我创建了这段代码:

<?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 回答