具有相同子节点名称的SimpleXMLElement xpath查询

问题描述 投票:0回答:1

我有一个类似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>
          <GyakorlatiVizsgaTipus>Bü</GyakorlatiVizsgaTipus>
          <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”节点在JSON输出中具有相同的“ MegyeKir”子节点,所以该子节点不在“ 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数组中的这些元素?

非常感谢您的帮助!

php json soap simplexml
1个回答
0
投票

与第二个//soap:Body//MegyeKir一起使用//指示XPath查找所有级别的所有元素。如果只需要主要元素,则应限制此。

由于<Body>标签和您要使用的<MegyeKir>之间只有一层,因此您应该使用/*/,这两个标签之间只允许有一层...

© www.soinside.com 2019 - 2024. All rights reserved.