如何使用 simplexml 获取 soap 消息中的元素名称
How to get element name in soap message using simplexml
您好,我正在尝试从这些 soap 消息中获取元素名称,以确定要采取的操作,但是在这种情况下,我得到的是 Body,accountInformationRequest 就是我想要的。我在单个 URL 因此需要获取元素 name.These 是我尝试过的
$xml=simplexml_load_string($content);
$xml->registerXPathNamespace('env', 'http://schemas.xmlsoap.org/soap/envelope/');
$xml->registerXPathNamespace('ns', 'http://www.yyy.com/mct/tx/2.0');
$xml->registerXPathNamespace('ns1', 'http://www.yyy.com/mct/ty/2.0');
$xml->registerXPathNamespace('ns2', 'http://www.yyy.com/mct/tx/2.1');
$xml->registerXPathNamespace('ns3', 'http://www.yyy.com/mct/ty/2.1');
$bodies = $xml->xpath('env:Body');
foreach($bodies as $body){
echo $body->getName();
$reply = $body->children('ns', TRUE)->accountInformationRequest;
}
//Soap message
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns="http://www.yyy.com/mct/tx/2.0"
xmlns:ns1="http://www.yyy.com/mct/ty/2.0"
xmlns:ns2="http://www.yyy.com/mct/tx/2.1"
xmlns:ns3="http://www.yyy.com/mct/ty/2.1">
<soapenv:Header/>
<soapenv:Body>
<ns:accountInformationRequest>
<ns:security>
<ns1:login>sam</ns1:login>
<ns1:password>lin</ns1:password>
</ns:security>
<ns:hsTransactionId>001</ns:hsTransactionId>
<ns:destinationUri>003</ns:destinationUri>
<!--Optional:-->
<ns:routingTag>B2B</ns:routingTag>
<!--Optional:-->
<ns2:vendorSpecificFields>
<!--Zero or more repetitions:-->
<ns3:vsf>
<ns3:vendorId>10</ns3:vendorId>
<ns3:fieldId>22</ns3:fieldId>
<ns3:value>2</ns3:value>
</ns3:vsf>
</ns2:vendorSpecificFields>
</ns:accountInformationRequest>
</soapenv:Body>
</soapenv:Envelope>
您的 XPath 特别要求在命名空间 http://schemas.xmlsoap.org/soap/envelope/
中使用名称 Body
的元素,因此对它找到的元素调用 getName()
将始终 return 名称 "Body".
你要找的是body标签的child的名字;您可以将其构建到 XPath 中,例如->xpath('env:Body/*')
,或者您可以遍历 $body
的子项,例如foreach ( $body->children('http://www.yyy.com/mct/tx/2.0') as $child ) { echo $child->getName(); }
您好,我正在尝试从这些 soap 消息中获取元素名称,以确定要采取的操作,但是在这种情况下,我得到的是 Body,accountInformationRequest 就是我想要的。我在单个 URL 因此需要获取元素 name.These 是我尝试过的
$xml=simplexml_load_string($content);
$xml->registerXPathNamespace('env', 'http://schemas.xmlsoap.org/soap/envelope/');
$xml->registerXPathNamespace('ns', 'http://www.yyy.com/mct/tx/2.0');
$xml->registerXPathNamespace('ns1', 'http://www.yyy.com/mct/ty/2.0');
$xml->registerXPathNamespace('ns2', 'http://www.yyy.com/mct/tx/2.1');
$xml->registerXPathNamespace('ns3', 'http://www.yyy.com/mct/ty/2.1');
$bodies = $xml->xpath('env:Body');
foreach($bodies as $body){
echo $body->getName();
$reply = $body->children('ns', TRUE)->accountInformationRequest;
}
//Soap message
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns="http://www.yyy.com/mct/tx/2.0"
xmlns:ns1="http://www.yyy.com/mct/ty/2.0"
xmlns:ns2="http://www.yyy.com/mct/tx/2.1"
xmlns:ns3="http://www.yyy.com/mct/ty/2.1">
<soapenv:Header/>
<soapenv:Body>
<ns:accountInformationRequest>
<ns:security>
<ns1:login>sam</ns1:login>
<ns1:password>lin</ns1:password>
</ns:security>
<ns:hsTransactionId>001</ns:hsTransactionId>
<ns:destinationUri>003</ns:destinationUri>
<!--Optional:-->
<ns:routingTag>B2B</ns:routingTag>
<!--Optional:-->
<ns2:vendorSpecificFields>
<!--Zero or more repetitions:-->
<ns3:vsf>
<ns3:vendorId>10</ns3:vendorId>
<ns3:fieldId>22</ns3:fieldId>
<ns3:value>2</ns3:value>
</ns3:vsf>
</ns2:vendorSpecificFields>
</ns:accountInformationRequest>
</soapenv:Body>
</soapenv:Envelope>
您的 XPath 特别要求在命名空间 http://schemas.xmlsoap.org/soap/envelope/
中使用名称 Body
的元素,因此对它找到的元素调用 getName()
将始终 return 名称 "Body".
你要找的是body标签的child的名字;您可以将其构建到 XPath 中,例如->xpath('env:Body/*')
,或者您可以遍历 $body
的子项,例如foreach ( $body->children('http://www.yyy.com/mct/tx/2.0') as $child ) { echo $child->getName(); }