【问题标题】:SOAP XML Read in PHP [closed]在 PHP 中读取 SOAP XML [关闭]
【发布时间】:2023-03-09 12:55:01
【问题描述】:

我无法阅读 soap xml file 。我需要在数组中取partition 元素

这是我的服务响应:

<?php $xml = '<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
               xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <GetNetworkTopologyResponse xmlns="http://tempuri.org/">
            <GetNetworkTopologyResult>
                <Action Type="NetworkTopology" Result="OK">
                    <topology MinVSATID="1280" MaxVSATID="376">
                        <partition UID="1" NAME="System">
                            <lvg UID="3605" NAME="BS_TEST"/>
                            <lvg UID="4452" NAME="Colocated VATS BH"/>
                            <lvg UID="4530" NAME="SkyMesh_V40"/>
                            <lvg UID="4845" NAME="Bordernet_V45"/>
                            <lvg UID="4846" NAME="HarbourIT_V42"/>
                            <lvg UID="4847" NAME="AN_V43"/>
                            <lvg UID="4848" NAME="ANT_V44"/>
                            <lvg UID="4850" NAME="Clrnet_V41"/>
                            <lvg UID="4851" NAME="Oion_V46"/>
                            <lvg UID="14072" NAME="NBNCo_V47"/>
                            <lvg UID="15811" NAME="iit_V50"/>
                            <lvg UID="15812" NAME="IPStar_V49"/>
                            <lvg UID="17784" NAME="COLOCATED"/>
                            <lvg UID="20655" NAME="Bluemaxx_V52"/>
                            <lvg UID="21333" NAME="SkyMesh_V55"/>
                            <lvg UID="22782" NAME="Indigo_V54"/>
                            <lvg UID="24836" NAME="NBDemo_V51"/>
                            <wg UID="457" NAME="OB_1" LAPUADDRESS="256" HSP="65" HSPIP="2.17.1.1"/>
                            <wg UID="25397" NAME="OB_1_VoIP" LAPUADDRESS="260"/>
                            <wg UID="27795" NAME="OB_1_WE" LAPUADDRESS="258"/>
                            <sg UID="8881" NAME="OB_60_52_00_14" LAPUADDRESS="515" VERSION="6.5.00.14">
                                <dataTPL UID="25197" NAME="DPS_12_6_52_00_22_VLAN_71-80"/>
                                <dataTPL UID="25195" NAME="DPS_12_6_52_00_22_VLAN_71-80"/>
                                <dataTPL UID="25193" NAME="DPS_12_6_52_00_22_VLAN_71-80"/>
                                <dataTPL UID="25191" NAME="DPS_12_6_52_00_22_VLAN_71-80"/>
                                <dataTPL UID="17031" NAME="DPS_12_6_52_00_22_VLAN_71-80"/>
                                <dataTPL UID="14168" NAME="DPS_12_6_52_00_22_VLAN_71-80"/>
                                <dataTPL UID="8876" NAME="DPS_12_6_52_00_22_VLAN_71-80"/>
                                <dataTPL UID="8874" NAME="DPS_12_6_52_00_22_VLAN_71-80"/>
                            </sg>
                            <sg UID="25396" NAME="OB_60_52_00_22" LAPUADDRESS="517" VERSION="6.2.00.22">
                                <dataTPL UID="27598" NAME="DPS_12_6_52_00_22_VLAN_71-80"/>
                                <dataTPL UID="27596" NAME="DPS_12_6_52_00_22_VLAN_61-70"/>
                                <dataTPL UID="27594" NAME="DPS_11_6_52_00_22_VLAN_71-80"/>
                                <dataTPL UID="27592" NAME="DPS_12_6_52_00_22_VLAN_71-80"/>
                                <dataTPL UID="27590" NAME="DPS_12_6_52_00_22_VLAN_37-52"/>
                                <dataTPL UID="27588" NAME="DPS_12_6_52_00_22_VLAN_53-60"/>
                                <dataTPL UID="27586" NAME="DPS_11_6_52_00_22_VLAN_53-60"/>
                                <dataTPL UID="25395" NAME="DPS_11_6_52_00_22_VLAN_37-52"/>
                            </sg>
                            <sg UID="27796" NAME="OB_NS1_60_52_01_18" LAPUADDRESS="518" VERSION="6.1.01.18">
                                <dataTPL UID="27814" NAME="DPS_12_6_52_00_22_VLAN_71-80"/>
                                <dataTPL UID="27812" NAME="DPS_12_6_52_00_22_VLAN_71-80"/>
                                <dataTPL UID="27810" NAME="DPS_12_6_52_00_22_VLAN_71-80"/>
                                <dataTPL UID="27808" NAME="DPS_12_6_52_00_22_VLAN_71-80"/>
                                <dataTPL UID="27806" NAME="DPS_12_6_52_00_22_VLAN_71-80"/>
                                <dataTPL UID="27804" NAME="DPS_12_6_52_00_22_VLAN_71-80"/>
                                <dataTPL UID="27802" NAME="DPS_12_6_52_00_22_VLAN_71-80"/>
                                <dataTPL UID="27798" NAME="DPS_12_6_52_00_22_VLAN_71-80"/>
                            </sg>
                        </partition>
                    </topology>
                </Action>
            </GetNetworkTopologyResult>
        </GetNetworkTopologyResponse>
    </soap:Body>
</soap:Envelope>'




print_r($xml);  // Return empty . no output
$xml->registerXPathNamespace('GetNetworkTopologyResponse', 'http://tempuri.org/');
foreach ($xml->xpath('//GetNetworkTopologyResponse:GetNetworkTopologyResult') as $item)
{
    print_r($item);
}

请告诉我,我的代码有什么问题。我是 php 新手。

请帮忙。

谢谢

【问题讨论】:

  • 你的致命错误仅仅意味着$xml 不是一个对象。使用print_r 打印$xml 的内容。此外,您使用了$soap_response,但在使用之前没有在任何地方定义它。
  • 返回空。我做了print_r($xml)。它返回空。请告诉我如何阅读。
  • 你想读取文件还是响应是字符串?
  • 是的。我编辑了我的问题。当print_r($xml) 时,它没有返回任何think.请指导我
  • @Piraba:我的答案工作正常,但您必须以不同的方式保存 xml 文件并单独保存 xml 代码。和以前一样

标签: php xml


【解决方案1】:
<?php

$xml=simplexml_load_file("text.xml");
print_r($xml);

$xml->registerXPathNamespace('GetNetworkTopologyResponse', 'http://tempuri.org/');
foreach ($xml->xpath('//GetNetworkTopologyResponse:GetNetworkTopologyResult') as $item)
{
print_r($item);
}
?>

这将打印元素数组,现在您可以对数组进行分区。

" 确保您的 XML SOAP 文件 (test.xml) 以 &lt;?XML.....&gt; 开头,文件开头没有任何空格,否则会出现错误: XML declaration allowed only at the start of the document"

【讨论】:

  • 非常感谢....还有一个问题,里面 foop 如何采取lvg tag name element 请任何想法我喜欢这个foreach ($xml-&gt;xpath('//GetNetworkTopologyResponse:lvg') as $item) { echo (string)$item-&gt;name; }
  • @Piraba: $json_string = json_encode($item); $result= json_decode($json_string, TRUE); $r=$result['0']['@attributes']['NAME']; echo $r; 将此代码添加到上一个代码中。您将获得第一个 lvg 标签名称的值。对于其他人“将 0 更改为 1,2,3...等等”
【解决方案2】:

有一个警告和一个致命错误。

您收到警告的原因是:
你使用了$soap_response,但没有定义它,也没有给它赋值。

此外,发生了致命错误,因为:
$xml 不是对象,因为simplexml_load_string 需要第一个字符串参数。

你正试图在一个不是对象的变量上调用成员函数。

试试这个

$xmlObj = simplexml_load_string($xml);
$xmlObj->registerXPathNamespace('envoy', 'http://apilistener.envoyservices.com');
foreach ($xmlObj->xpath('//envoy:payment') as $item){
    print_r($item);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    相关资源
    最近更新 更多