simpleXmlIterator-> valid()为有效的xml返回false

时间:2014-09-25 09:34:42

标签: php xml

我正在尝试使用simpleXmlIterator迭代以下xml。哪个xmlspy和notepad ++声明有效。 simplexmlelement-> asXML()返回相同的输入。但是,即使在simpleXmlIterator-> rewind()之后,simpleXmlIterator-> valid()也会返回false。

为什么函数simpleXmlIterator-> valid()认为它无效? 我的PHP代码echos N

$xml = new simpleXmlIterator( $xmlstring );
$xml->rewind();
echo $xml->valid() ? "Y" : "N";

$ xmlstring中使用的XML

<tns1:transaction xmlns:tns="http://www.cancerresearchuk.org/di/r17/commonTypes" xmlns:tns1="http://www.cancerresearchuk.org/di/r17/supplier/newdonate" xsi:schemaLocation="http://www.cancerresearchuk.org/di/r17/commonTypes commonTypesDI.xsd http://www.cancerresearchuk.org/di/r17/supplier/newdonate supplier_newdonate_Version4.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <tns1:reference>DG007</tns1:reference>
  <tns1:supporter>
    <tns1:primaryExternalReferenceId>DeepsSceThree</tns1:primaryExternalReferenceId>
    <tns1:primaryDataSourceCode>ND</tns1:primaryDataSourceCode>
    <tns1:secondaryExternalReferenceId></tns1:secondaryExternalReferenceId>
    <tns1:secondaryDataSourceCode></tns1:secondaryDataSourceCode>
    <tns1:forename>TT</tns1:forename>
    <tns1:startDate>2014-07-15T13:11:20.000000000</tns1:startDate>
    <tns1:source>12XSU7006</tns1:source>
    <tns1:statusCode>Live</tns1:statusCode>
    <tns1:statusDate>2014-07-29</tns1:statusDate>
    <tns1:surname>GuptaSceThree</tns1:surname>
    <tns1:title>Sir</tns1:title>
    <tns1:address>
      <tns1:addressLine1>28 Cadmus Court</tns1:addressLine1>
      <tns1:addressLine2></tns1:addressLine2>
      <tns1:addressLine3></tns1:addressLine3>
      <tns1:city>London</tns1:city>
      <tns1:country>United Kingdom</tns1:country>
      <tns1:county>Cheshire</tns1:county>
      <tns1:postalCode>OX4 2WB</tns1:postalCode>
      <tns1:startDate>2014-01-13</tns1:startDate>
      <tns1:validationStatus>NV</tns1:validationStatus>
    </tns1:address>
    <tns1:contactInfo-Phone>
      <tns1:phoneNumber>01231231221</tns1:phoneNumber>
    </tns1:contactInfo-Phone>
    <tns1:contactInfo-Email>
      <tns1:emailAddress>james@johnson.com</tns1:emailAddress>  
    </tns1:contactInfo-Email> 
                <tns1:contactInfo-Mobile>
      <tns1:mobileNumber>07516655678</tns1:mobileNumber>
                </tns1:contactInfo-Mobile>
                <tns1:directDebit>
      <tns1:accountName>JessiAccName</tns1:accountName>
      <tns1:amount>20.12</tns1:amount>
      <tns1:bankAccountNumber>43608868</tns1:bankAccountNumber>
      <tns1:bankSortCode>050370</tns1:bankSortCode>
      <tns1:bankAccountCode-CRUK>121</tns1:bankAccountCode-CRUK>
      <tns1:frequency>Monthly</tns1:frequency>
      <tns1:product>CRDD</tns1:product>
      <tns1:reference>Deeps3</tns1:reference>
      <tns1:source>Donations</tns1:source>
      <tns1:paymentDay>19</tns1:paymentDay>
      <tns1:toBeGiftAided>Y</tns1:toBeGiftAided>
      <tns1:letterCodeGAD>09DTDVGC</tns1:letterCodeGAD>
      <tns1:methodGAD>Written</tns1:methodGAD>
      <tns1:inMemoryName>TOM</tns1:inMemoryName>
      <tns1:motivation>MEM</tns1:motivation>
      <tns1:dataSource>ND</tns1:dataSource>
    </tns1:directDebit>
    <tns1:listOfSuppressionsPreferences>
      <tns1:suppressionsPreferences>
        <tns1:startDate>2014-08-18</tns1:startDate>
     <tns1:suppressionPreferenceCode>SMS</tns1:suppressionPreferenceCode>
        <tns1:source>12XSU7009</tns1:source>
      </tns1:suppressionsPreferences>
    </tns1:listOfSuppressionsPreferences>
<tns1:listOfMailingActivities>
      <tns1:mailingActivities>
        <tns1:originatorActivityID>SK-ACT-OID0048</tns1:originatorActivityID>
        <tns1:category>Donate in Memory</tns1:category>
        <tns1:endDate>2014-08-20T21:21:01.000000000</tns1:endDate>
        <tns1:letterCode>1VGA</tns1:letterCode>
      </tns1:mailingActivities>
    </tns1:listOfMailingActivities>  
  </tns1:supporter>
</tns1:transaction>

这背后的原因是我想将XML转换为array / json,并且由于namesapce,标准解决方案无法正常工作。我发现这个代码声称可以工作但是没能完成main while循环的第一个障碍,所以我认为这是我的XML就是问题所在。这是我正在使用的代码

    public function xmlToArray( $xml, $namespaces )
{
    $a = array();
    $xml->rewind();
    echo $xml->valid() ? "Y" : "N";
    while( $xml->valid() )
    {
        $key = $xml->key();
        if( !isset( $a[$key] ) ) 
        {
            $a[$key] = array(); $i=0; 
        }
        else
        {
            $i = count( $a[$key] );
        }
        $simple = true;
        foreach( $xml->current()->attributes() as $k=>$v ) 
        {
            $a[$key][$i][$k]=(string)$v;
            $simple = false;
        }

        if( $this->namespaces ) 
        {
            foreach( $this->namespaces as $nid=>$name ) 
            {
                foreach( $xml->current()->attributes( $name ) as $k=>$v ) 
                {
                    $a[$key][$i][$nid.':'.$k] =( string )$v;
                    $simple = false;
                }
            }
        } 
        if( $xml->hasChildren() ) 
        {
            if( $simple ) $a[$key][$i] = $this->xmlToArray( $xml->current(), $this->namespaces );
            else $a[$key][$i]['content'] = $this->xmlToArray( $xml->current(), $this->namespaces);
        } 
        else 
        {
            if($simple) 
            {
                $a[$key][$i] = strval( $xml->current() );
            }
            else 
            {
                $a[$key][$i]['content'] = strval( $xml->current() );
            }
        }
        $i++;
        $xml->next();
    }
    return $a;
}

0 个答案:

没有答案