Удаление сведений о схеме из выходного xml и преобразование в массив (с использованием PHP SoapClient и simplexml_load_string или SimpleXMLElement)

Я получаю XML-ответ от стороннего сервиса,

$soap = new SoapClient($wsdl, $options);
$data = $soap->method($params);

Ответ выглядит как значения объекта Stdclass

$data содержит xml внутри объекта массива

$data->resultResponse->любой содержит формат xml ниже,

<xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet"><xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="Temp" ..... </xs:element></xs:schema><diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"><DocumentElement xmlns=""><Temp diffgr:id="Temp1" msdata:rowOrder="0"><name>Siva</name><age>18</age>....<location>chennai</chennai></Temp><Temp diffgr:id="Temp2" msdata:rowOrder="0"><name>John</name><age>18</age>....<location>chennai</chennai></Temp>

I am getting below error When this xml using in to SimpleXMLElement or simplexml_load_string for array conversion ,

$res = $data->resultResponse->any;
$res1 = new SimpleXMLElement($res);
$res2 = simplexml_load_string($res);

Для обоих $res1 и $res2,

Warning: simplexml_load_string(): Entity: line 1: parser error : Extra content at the end of the document in soap.php on line 40

Мне не нужен "<xs:schema" из этого xml. Я хочу "<diffgr:diffgram" значений.

Раньше для этого я использовал библиотеку nusoap. Это отлично работает для меньшего количества данных памяти. Nusoap преобразует весь xml в массив. Но клиент Php-Soap предоставляет только элементы первого уровня в качестве объектов/ключей.

Я пробовал уже несколько способов в loadXml в DOM и preg_replace. Но они не очень полезны

Пожалуйста, помогите мне решить проблему.

Исходный XML-ответ, полученный от Boomerang,

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<ClaimMISResponse xmlns="http://tempuri.org/">
<ClaimMISResult>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="Temp" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Temp">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" minOccurs="0" />
...
<xs:element name="location" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<DocumentElement xmlns="">
<Temp diffgr:id="Temp1" msdata:rowOrder="0">
<name>John</name>
...
<location>Chennai</location>
</Temp>
</DocumentElement>
</diffgr:diffgram>
</ClaimMISResult>
</ClaimMISResponse>
</soap:Body>
</soap:Envelope>

person Tamilvanan    schedule 18.11.2016    source источник
comment
Возможный дубликат Синтаксический анализ сложного XML в PHP5   -  person Rahul Singh    schedule 18.11.2016
comment
@RahulSingh В моем вопросе проблема в том, что я не получаю ответа от simplexml_load_string.   -  person Tamilvanan    schedule 18.11.2016
comment
Размещенный вами XML является неполным и поврежденным. Кроме того, это похоже на объединение двух XML-документов, XML-документ может иметь только один узел корневого элемента. В противном случае это фрагмент XML. DOM может загружать фрагменты XML с помощью DOMDocumentFragment::appendXml().   -  person ThW    schedule 18.11.2016
comment
@ThW Спасибо. Этот xml не был оригиналом из ответа. Я обновил сейчас в вопросе. Пожалуйста, проверь это.   -  person Tamilvanan    schedule 18.11.2016
comment
что такое код на вашем soap.php   -  person Rahul Singh    schedule 20.11.2016
comment
Вы исправили это? @Тамилванан   -  person Farshid    schedule 21.01.2021


Ответы (1)


Это так просто, взорвите свой результат на ‹/xs:schema›

$result = \explode('</xs:schema>', $data->resultResponse->any);
$array = json_decode(json_encode((array)simplexml_load_string($result[1])),true);
person Farshid    schedule 20.01.2021