我正在尝试使用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;
}