Не удается получить значения дочерних элементов в XML

1

Я получаю следующий ответ от веб-службы. Мне нужно получить значения внутри dtAccData (FULL_NAME, GLOBAL_ID)

    <?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">
  <strGetCustomerValidationResponse xmlns="http://tempuri.org/">
    <strGetCustomerValidationResult>21^Please complete your pending form^150675^1</strGetCustomerValidationResult>
    <dtAccData>
      <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="Table" msdata:UseCurrentLocale="true">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="Table">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="FULL_NAME" type="xs:string" minOccurs="0" />
                <xs:element name="GLOBAL_ID" 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">
        <NewDataSet xmlns="">
          <Table diffgr:id="Table1" msdata:rowOrder="0">
            <FULL_NAME>TEST39</FULL_NAME>
            <GLOBAL_ID>37405-9879863-7</GLOBAL_ID>
          </Table>
        </NewDataSet>
      </diffgr:diffgram>
    </dtAccData>
  </strGetCustomerValidationResponse>
</soap:Envelope>

Если я загружаюсь в простой объект XML и дамп, я не вижу никаких значений внутри dtAccData. Я только ниже.

$xml = new SimpleXMLElement($xml_tring);
var_dump($xml);

я получил

GetCustomerValidationResponse"]=> object(SimpleXMLElement)#2 (2) { ["strGetCustomerValidationResult"]=> string(45) "21^Please complete your pending form^630160^1" ["dtAccData"]=> object(SimpleXMLElement)#3 (0) { } } }

Что я должен делать.

  • 0
    Почему вы не используете расширение SOAP?
  • 0
    @ThW Я не знал, что можно анализировать XML с расширением SOAP. Можете ли вы опубликовать пример кода.
Показать ещё 2 комментария
Теги:
web-services
domdocument

1 ответ

1
Лучший ответ

Здесь мы используем DOMDocument для извлечения textContent внутри элемента.

Попробуйте этот фрагмент кода здесь

<?php

ini_set('display_errors', 1);
$string='<?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">
  <strGetCustomerValidationResponse xmlns="http://tempuri.org/">
    <strGetCustomerValidationResult>21^Please complete your pending form^150675^1</strGetCustomerValidationResult>
    <dtAccData>
      <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="Table" msdata:UseCurrentLocale="true">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="Table">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="FULL_NAME" type="xs:string" minOccurs="0" />
                <xs:element name="GLOBAL_ID" 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">
        <NewDataSet xmlns="">
          <Table diffgr:id="Table1" msdata:rowOrder="0">
            <FULL_NAME>TEST39</FULL_NAME>
            <GLOBAL_ID>37405-9879863-7</GLOBAL_ID>
          </Table>
        </NewDataSet>
      </diffgr:diffgram>
    </dtAccData>
  </strGetCustomerValidationResponse>
</soap:Envelope>';
$domDocument= new DOMDocument();
$domDocument->loadXML($string);
echo $FULL_NAME=$domDocument->getElementsByTagName("FULL_NAME")->item(0)->textContent;
echo PHP_EOL;
echo $GLOBAL_ID=$domDocument->getElementsByTagName("GLOBAL_ID")->item(0)->textContent;

Выход:

TEST39 37405-9879863-7

Если ваш ответ XML не содержит. из этих тегов, из которых вы хотите извлечь информацию. Вы можете использовать этот код для получения multiple occurences

Попробуйте этот фрагмент кода здесь for multiple occurences

<?php

$domDocument= new DOMDocument();
$domDocument->loadXML($string);
$result=array();
foreach($domDocument->getElementsByTagName("FULL_NAME") as $fullnameElement)
{
    $result["FULL_NAME"][]=$fullnameElement->textContent;
}
foreach($domDocument->getElementsByTagName("GLOBAL_ID") as $fullnameElement)
{
    $result["GLOBAL_ID"][]=$fullnameElement->textContent;
}
print_r($result);

Выход:

Array
(
    [FULL_NAME] => Array
        (
            [0] => TEST39
        )

    [GLOBAL_ID] => Array
        (
            [0] => 37405-9879863-7
        )

)
  • 0
    Это работает как очарование для меня, потому что я знаю все элементы и количество экземпляров каждого элемента. Спасибо Сахиль. Если вы знаете, как мы должны это делать, когда у нас есть повторяющаяся структура, пожалуйста, поделитесь этим. В любом случае большое спасибо.
  • 1
    @KasunRajapaksha Я обновил свой пост, вы можете проверить его. добро пожаловать .... :)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню