SimpleXMLElement xpath-запрос с теми же именами дочерних узлов - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть SOAP ответ XML как:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <ns2:VizsgaHelyszinLekerdezValasz xmlns:ns2="...">
      <MegyeKir>
        <MegyeKir>id_1</MegyeKir>
        <KirendeltsegNev>KirendeltsegNev_1</KirendeltsegNev>
        <VizsgaHelyszin>
          <Nev>Nev_1</Nev>
          <VizsgaHelyszinKod>9020</VizsgaHelyszinKod>
          <ElmeletiVizsgaTipus>Bü</ElmeletiVizsgaTipus>
          <GyakorlatiVizsgaTipus>F</GyakorlatiVizsgaTipus>
        </VizsgaHelyszin>
        <VizsgaHelyszin>
          <Nev>Nev2</Nev>
          <VizsgaHelyszinKod>823020</VizsgaHelyszinKod>
          <GyakorlatiVizsgaTipus>Jk</GyakorlatiVizsgaTipus>
        </VizsgaHelyszin>
      </MegyeKir>
      <MegyeKir>
        <MegyeKir>id_2</MegyeKir>
        <KirendeltsegNev>KirendeltsegNev_2</KirendeltsegNev>
        <VizsgaHelyszin>
          <Nev>Nev_1</Nev>
          <VizsgaHelyszinKod>9020</VizsgaHelyszinKod>
          <GyakorlatiVizsgaTipus>Bü</GyakorlatiVizsgaTipus>
          <GyakorlatiVizsgaTipus>F</GyakorlatiVizsgaTipus>
        </VizsgaHelyszin>
        <VizsgaHelyszin>
          <Nev>Nev2</Nev>
          <VizsgaHelyszinKod>823020</VizsgaHelyszinKod>
          <GyakorlatiVizsgaTipus>Jk</GyakorlatiVizsgaTipus>
        </VizsgaHelyszin>
    </MegyeKir>
   </ns2:VizsgaHelyszinLekerdezValasz>
  </soap:Body>
</soap:Envelope>

Я хотел бы создать JSON объект из него следующим образом:

$response_xml = new SimpleXMLElement($response);

$response_xml->registerXPathNamespace('soap', 'http://schemas.xmlsoap.org/soap/envelope/');
$megyekir = $response_xml->xpath("//soap:Body//MegyeKir");

echo json_encode($megyekir);

Проблема: поскольку узел "MegyeKir" имеет тот же дочерний узел "MegyeKir" в выводе JSON, дочерний узел не находится под "MegyeKir", но в отдельном ключе:

0: {MegyeKir: "id_1", KirendeltsegNev: "KirendeltsegNev_1", VizsgaHelyszin: [,…]}
1: {0: "id_1"}
2: {MegyeKir: "id_2", KirendeltsegNev: "KirendeltsegNev_2",…}
3: {0: "id_2"}

Как я могу пропустить эти элементы из массива JSON?

Большое спасибо за вашу помощь!

1 Ответ

0 голосов
/ 14 апреля 2020

Использование //soap:Body//MegyeKir со вторым // указывает XPath найти все элементы на всех уровнях. Если вам нужен только основной элемент, вы должны ограничить это.

Поскольку между тегом <Body> и нужным <MegyeKir> имеется только 1 слой, вы должны использовать /*/, что позволяет только 1 уровень между двумя тегами ...

$megyekir = $response_xml->xpath("//soap:Body/*/MegyeKir");
...