Как я могу получить первый дочерний элемент из XML?

Как я могу получить первый дочерний элемент из xml в PHP мой код:

    $xmlPath = 'www.example.com/file.xml';
    $fileContents= file_get_contents($xmlPath);

    $fileContents = str_replace(array("\n", "\r", "\t", "<br>"), '', $fileContents);
      $fileContents = trim(str_replace('"', "'", $fileContents));
      $simpleXml = simplexml_load_string($fileContents);
      $xmlArray = array();
      foreach($simpleXml->children() as $child) {
        $xmlArray [] = array(
          'parent' => $child->getName(),
        );
        foreach($child->children() as $subchild) {
          $xmlArray[] = array(
            'child' => $subchild->getName()
          );
        }
      }

XML-код:

<root>
<urun>
<UrunID>9728</UrunID>
<Kod>3697-844 BORDO</Kod>
<Baslik>İRONİ KRUVAZE BORDO EKOSELİ ŞİFON BLUZ</Baslik>
<Renk>BORDO</Renk>
<Aciklama>Kumaş Bilgisi: %100 POLYESTER<br><br>Manken Ölçüleri: Göğüs : 85, Bel : 61, Kalça : 89, Boy:177<br><br>Mankenin Giydiği Beden: S/36</Aciklama>
<Durum>1</Durum>
<mainCategory>Kadın Giyim</mainCategory>
<subCategory>Bluz</subCategory>
<Marka>İroni</Marka>
<kdvHaricFiyat>9.17</kdvHaricFiyat>
<kdvDahilFiyat>9.90</kdvDahilFiyat>
<kdvDahilAlisFiyat>6.44</kdvDahilAlisFiyat>
<fiyatparabirimi>TL</fiyatparabirimi>
<KDV>8</KDV>
<link>
http://www.ironitekstil.com/urun/ironi-kruvaze-bordo-ekoseli-sifon-bluz_9728.aspx
</link>
<ImageName1>
http://www.ironitekstil.com/uploads/productsimages/3697-844-ironi-bordo-gomlek-1.jpg
</ImageName1>
<ImageName2>
http://www.ironitekstil.com/uploads/productsimages/3697-844-ironi-bordo-gomlek-3.jpg
</ImageName2>
<ImageName3>
http://www.ironitekstil.com/uploads/productsimages/3697-844-ironi-bordo-gomlek-2.jpg
</ImageName3>
<Kur>TL</Kur>
<StokAdedi>2</StokAdedi>
<Stoklar>
<stok>
<isim>BORDO</isim>
<deger>S</deger>
<barcode>1000000007077</barcode>
<miktar>0</miktar>
</stok>
<stok>
<isim>BORDO</isim>
<deger>XS</deger>
<barcode>1000000007619</barcode>
<miktar>2</miktar>
</stok>
<stok>
<isim>BORDO</isim>
<deger>M</deger>
<barcode>1000000007626</barcode>
<miktar>0</miktar>
</stok>
<stok>
<isim>BORDO</isim>
<deger>L</deger>
<barcode>1000000007633</barcode>
<miktar>0</miktar>
</stok>
<stok>
<isim>BORDO</isim>
<deger>XL</deger>
<barcode>3543000015973</barcode>
<miktar>0</miktar>
</stok>
</Stoklar>
<yeniSezon/>
</urun>
<urun>
<UrunID>9728</UrunID>
<Kod>3697-844 BORDO</Kod>
<Baslik>İRONİ KRUVAZE BORDO EKOSELİ ŞİFON BLUZ</Baslik>
<Renk>BORDO</Renk>
<Aciklama>Kumaş Bilgisi: %100 POLYESTER<br><br>Manken Ölçüleri: Göğüs : 85, Bel : 61, Kalça : 89, Boy:177<br><br>Mankenin Giydiği Beden: S/36</Aciklama>
<Durum>1</Durum>
<mainCategory>Kadın Giyim</mainCategory>
<subCategory>Bluz</subCategory>
<Marka>İroni</Marka>
<kdvHaricFiyat>9.17</kdvHaricFiyat>
<kdvDahilFiyat>9.90</kdvDahilFiyat>
<kdvDahilAlisFiyat>6.44</kdvDahilAlisFiyat>
<fiyatparabirimi>TL</fiyatparabirimi>
<KDV>8</KDV>
<link>
http://www.ironitekstil.com/urun/ironi-kruvaze-bordo-ekoseli-sifon-bluz_9728.aspx
</link>
<ImageName1>
http://www.ironitekstil.com/uploads/productsimages/3697-844-ironi-bordo-gomlek-1.jpg
</ImageName1>
<ImageName2>
http://www.ironitekstil.com/uploads/productsimages/3697-844-ironi-bordo-gomlek-3.jpg
</ImageName2>
<ImageName3>
http://www.ironitekstil.com/uploads/productsimages/3697-844-ironi-bordo-gomlek-2.jpg
</ImageName3>
<Kur>TL</Kur>
<StokAdedi>2</StokAdedi>
<Stoklar>
<stok>
<isim>BORDO</isim>
<deger>S</deger>
<barcode>1000000007077</barcode>
<miktar>0</miktar>
</stok>
<stok>
<isim>BORDO</isim>
<deger>XS</deger>
<barcode>1000000007619</barcode>
<miktar>2</miktar>
</stok>
<stok>
<isim>BORDO</isim>
<deger>M</deger>
<barcode>1000000007626</barcode>
<miktar>0</miktar>
</stok>
<stok>
<isim>BORDO</isim>
<deger>L</deger>
<barcode>1000000007633</barcode>
<miktar>0</miktar>
</stok>
<stok>
<isim>BORDO</isim>
<deger>XL</deger>
<barcode>3543000015973</barcode>
<miktar>0</miktar>
</stok>
</Stoklar>
<yeniSezon/>
</urun>
</root>

Итак, я хочу получить только первый элемент, как я могу это сделать, любое предложение?

3 ответа

Если я не понимаю вопрос (что возможно, вы не очень ясно поняли), у вас есть цикл над всеми дочерними элементами:

foreach($simpleXml->children() as $child) {

Изменить это так, чтобы просто получить доступ к первому дочернему элементу, действительно тривиально:

$children = $simpleXml->children();
$first_child = $children[0];

В SimpleXML:

$root = new SimpleXMLElement($xml);

$firstElementChild = $root->children()[0];

Или с Xpath:

$root = new SimpleXMLElement($xml);

$firstElementChild = $root->xpath('./*[1]')[0];

В DOM Level 2 (это реализовано в PHP ext/dom.)

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
$context = $document->documentElement;

$firstElementChild = $xpath->evaluate('./*[1]', $context)[0];

В первом подходе SimpleXML рассматривает DOM как дерево вложенных элементов. Два других используют Xpath для извлечения всех дочерних элементов и ограничивают список результатов 1, а затем выбирают первый элемент (индекс 0) из списка результатов.

В DOM Level 3 узлы с детьми имеют firstElementChild имущество.

Это просто с собственным DomDocument в PHP.

$oXML = (new DomDocument())->load('path/to/your/file.xml');
$oElement = $oXML->getElementsByTagName('urun');

После этого $oElement является объектом DOMNodeList, по которому вы можете выполнять итерации.

Чтобы получить контент:

$oElement->item(0)->nodeValue;

Очевидно, что в узле urun нет содержимого. Только дочерние узлы. В DomNodeList $oElement включает все содержимое узла urun. Вы можете перебрать его. Вы можете искать другие узлы в нем. Он содержит все дочерние узлы, которые получил урун.

Другие вопросы по тегам