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

SimpleXMLElement xpath query with same childnode names

我有一个 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" 节点在 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 数组中跳过这些元素?

非常感谢您的帮助!

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

因为 <Body> 标签和你想要的 <MegyeKir> 之间只有一层,你应该使用 /*/ 这两个标签之间只有一层......

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