在 PHP 中操纵 XML
Manipulation of XML in PHP
我有一个 API 调用,其中 returns 一个 XML 字符串,我已经用新的 SimpleXmlElement 转换了那个响应,所以它 returns 我一个 XML 目的。下面是结果
SimpleXMLElement Object
(
[0] => <root>
<PINCODELIST>
<PINCODE>152001</PINCODE>
<CITYNAME>GURDASPUR</CITYNAME>
<ACTIVEFLAG>Y</ACTIVEFLAG>
<EDIT_DATE>09 May 2015 10:47:20</EDIT_DATE>
<ROUTINGCODE>N/PB/1026/FRZPR</ROUTINGCODE>
</PINCODELIST>
</root>
)
我如何访问根标签中的每个元素,假设它可以有 X 个 PINCODELIST 标签。
我试过 $res[0]->root 但它给了我简单XML元素对象 ( )
有什么想法吗?
加载 xml
文件后,您可以访问 root
之后的节点。
在您的示例中是 xml 节点的数组或列表,在解析后成为 SimpleXMLElement
对象的数组。
假设下面 xml
结构
<root>
<PINCODELIST>
<PINCODE>152001</PINCODE>
<CITYNAME>GURDASPUR</CITYNAME>
<ACTIVEFLAG>Y</ACTIVEFLAG>
<EDIT_DATE>09 May 2015 10:47:20</EDIT_DATE>
<ROUTINGCODE>N/PB/1026/FRZPR</ROUTINGCODE>
</PINCODELIST>
<PINCODELIST>
<PINCODE>152002</PINCODE>
<CITYNAME>GURDASPUR</CITYNAME>
<ACTIVEFLAG>Y</ACTIVEFLAG>
<EDIT_DATE>09 May 2015 10:47:20</EDIT_DATE>
<ROUTINGCODE>N/PB/1026/FRZPR</ROUTINGCODE>
</PINCODELIST>
</root>
使用以下php
访问每个元素
$pincodelist = simplexml_load_file('xml.xml');
foreach($pincodelist as $pincode){
print $pincode->PINCODE . PHP_EOL;
}
会输出
152001
152002
如果您想从您的对象访问单个节点,您可以这样做:
print $res[0]->PINCODE;
其中$res
是simplexml_load_*
的结果,[0]
是数组的索引,PINCODE
是节点名。
我无法评论 SimpleXmlElement
或相关方法,但使用标准 DOMDocument
相当简单。它需要一个字符串作为输入,但如果愿意,可以很容易地修改以加载 XML 文件。
/* helper function to return the value of a node */
function gnv( $node,$tag ){
return $node->getElementsByTagName( $tag )->item(0)->nodeValue;
}
$data="
<root>
<PINCODELIST>
<PINCODE>152001</PINCODE>
<CITYNAME>GURDASPUR</CITYNAME>
<ACTIVEFLAG>Y</ACTIVEFLAG>
<EDIT_DATE>09 May 2015 10:47:20</EDIT_DATE>
<ROUTINGCODE>N/PB/1026/FRZPR</ROUTINGCODE>
</PINCODELIST>
<PINCODELIST>
<PINCODE>152003</PINCODE>
<CITYNAME>Mumbai</CITYNAME>
<ACTIVEFLAG>N</ACTIVEFLAG>
<EDIT_DATE>09 May 2015 11:21:20</EDIT_DATE>
<ROUTINGCODE>O/PB/1036/FRZPR</ROUTINGCODE>
</PINCODELIST>
</root>";
$url='http://<SERVER>/jhds/services/ws_webx_dataexchange.asmx/PincodeSync?FromDate=&CustomerCode=CC000200115';
$data=file_get_contents( $url );
/* For storing pincodes and data */
$codes=array();
libxml_use_internal_errors( true );
$dom=new DOMDocument;
$dom->validateOnParse=false;
$dom->standalone=true;
$dom->preserveWhiteSpace=true;
$dom->strictErrorChecking=false;
$dom->substituteEntities=false;
$dom->recover=true;
$dom->formatOutput=false;
/* Here you load your xml data as a string */
$dom->loadXML( html_entity_decode( $data ) );
$parse_errs=serialize( libxml_get_last_error() );
libxml_clear_errors();
$pincodes=$dom->getElementsByTagName('PINCODELIST');
foreach( $pincodes as $index => $node ) {
if( $node->nodeType==XML_ELEMENT_NODE ){
$codes[ gnv( $node, 'PINCODE' ) ]=(object)array(
'CITYNAME' => gnv( $node, 'CITYNAME' ),
'ACTIVEFLAG' => gnv( $node, 'ACTIVEFLAG' ),
'EDIT_DATE' => gnv( $node, 'EDIT_DATE' ),
'ROUTINGCODE' => gnv( $node, 'ROUTINGCODE' )
);
}
}
$dom=null;
/* debug output */
echo '<pre>',print_r($codes,true),'</pre>';
/* To access specific items by their pincode later */
echo $codes['152001']->ROUTINGCODE;
我有一个 API 调用,其中 returns 一个 XML 字符串,我已经用新的 SimpleXmlElement 转换了那个响应,所以它 returns 我一个 XML 目的。下面是结果
SimpleXMLElement Object
(
[0] => <root>
<PINCODELIST>
<PINCODE>152001</PINCODE>
<CITYNAME>GURDASPUR</CITYNAME>
<ACTIVEFLAG>Y</ACTIVEFLAG>
<EDIT_DATE>09 May 2015 10:47:20</EDIT_DATE>
<ROUTINGCODE>N/PB/1026/FRZPR</ROUTINGCODE>
</PINCODELIST>
</root>
)
我如何访问根标签中的每个元素,假设它可以有 X 个 PINCODELIST 标签。
我试过 $res[0]->root 但它给了我简单XML元素对象 ( )
有什么想法吗?
加载 xml
文件后,您可以访问 root
之后的节点。
在您的示例中是 xml 节点的数组或列表,在解析后成为 SimpleXMLElement
对象的数组。
假设下面 xml
结构
<root>
<PINCODELIST>
<PINCODE>152001</PINCODE>
<CITYNAME>GURDASPUR</CITYNAME>
<ACTIVEFLAG>Y</ACTIVEFLAG>
<EDIT_DATE>09 May 2015 10:47:20</EDIT_DATE>
<ROUTINGCODE>N/PB/1026/FRZPR</ROUTINGCODE>
</PINCODELIST>
<PINCODELIST>
<PINCODE>152002</PINCODE>
<CITYNAME>GURDASPUR</CITYNAME>
<ACTIVEFLAG>Y</ACTIVEFLAG>
<EDIT_DATE>09 May 2015 10:47:20</EDIT_DATE>
<ROUTINGCODE>N/PB/1026/FRZPR</ROUTINGCODE>
</PINCODELIST>
</root>
使用以下php
访问每个元素
$pincodelist = simplexml_load_file('xml.xml');
foreach($pincodelist as $pincode){
print $pincode->PINCODE . PHP_EOL;
}
会输出
152001
152002
如果您想从您的对象访问单个节点,您可以这样做:
print $res[0]->PINCODE;
其中$res
是simplexml_load_*
的结果,[0]
是数组的索引,PINCODE
是节点名。
我无法评论 SimpleXmlElement
或相关方法,但使用标准 DOMDocument
相当简单。它需要一个字符串作为输入,但如果愿意,可以很容易地修改以加载 XML 文件。
/* helper function to return the value of a node */
function gnv( $node,$tag ){
return $node->getElementsByTagName( $tag )->item(0)->nodeValue;
}
$data="
<root>
<PINCODELIST>
<PINCODE>152001</PINCODE>
<CITYNAME>GURDASPUR</CITYNAME>
<ACTIVEFLAG>Y</ACTIVEFLAG>
<EDIT_DATE>09 May 2015 10:47:20</EDIT_DATE>
<ROUTINGCODE>N/PB/1026/FRZPR</ROUTINGCODE>
</PINCODELIST>
<PINCODELIST>
<PINCODE>152003</PINCODE>
<CITYNAME>Mumbai</CITYNAME>
<ACTIVEFLAG>N</ACTIVEFLAG>
<EDIT_DATE>09 May 2015 11:21:20</EDIT_DATE>
<ROUTINGCODE>O/PB/1036/FRZPR</ROUTINGCODE>
</PINCODELIST>
</root>";
$url='http://<SERVER>/jhds/services/ws_webx_dataexchange.asmx/PincodeSync?FromDate=&CustomerCode=CC000200115';
$data=file_get_contents( $url );
/* For storing pincodes and data */
$codes=array();
libxml_use_internal_errors( true );
$dom=new DOMDocument;
$dom->validateOnParse=false;
$dom->standalone=true;
$dom->preserveWhiteSpace=true;
$dom->strictErrorChecking=false;
$dom->substituteEntities=false;
$dom->recover=true;
$dom->formatOutput=false;
/* Here you load your xml data as a string */
$dom->loadXML( html_entity_decode( $data ) );
$parse_errs=serialize( libxml_get_last_error() );
libxml_clear_errors();
$pincodes=$dom->getElementsByTagName('PINCODELIST');
foreach( $pincodes as $index => $node ) {
if( $node->nodeType==XML_ELEMENT_NODE ){
$codes[ gnv( $node, 'PINCODE' ) ]=(object)array(
'CITYNAME' => gnv( $node, 'CITYNAME' ),
'ACTIVEFLAG' => gnv( $node, 'ACTIVEFLAG' ),
'EDIT_DATE' => gnv( $node, 'EDIT_DATE' ),
'ROUTINGCODE' => gnv( $node, 'ROUTINGCODE' )
);
}
}
$dom=null;
/* debug output */
echo '<pre>',print_r($codes,true),'</pre>';
/* To access specific items by their pincode later */
echo $codes['152001']->ROUTINGCODE;