在 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;

其中$ressimplexml_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;