如何从XML中获取第一个子元素?

4

如何在 PHP 中获取 xml 的第一个子元素,我的代码:

    $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>

我只想获取第一个元素,该怎么做?有什么建议吗?


请粘贴您的 XML 代码。 - Harsh Barach
第一个元素是什么? - u_mulder
首先元素以标签名称“urun”开头。 - Mahmoud Ismail
你可以打破你的foreach循环。第一个元素将被处理,使用break跳过其他元素。 - u_mulder
3个回答

4
除非我误解了问题(这是可能的,因为你表述不够清晰),否则您需要遍历所有子元素的循环:
foreach($simpleXml->children() as $child) {

将其更改为仅访问第一个子元素非常简单:
$children = $simpleXml->children();
$first_child = $children[0];

3

在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属性。


XPath总是让我想起正则表达式:强大,但在许多情况下都过于复杂。在这种情况下,您可以在SimpleXML中只需获取$root->children()[0];DOM可能会更加棘手。 - IMSoP
1
你说得对。我总是想着节点,有时忘记了SimpleXML更像一个元素树。 - ThW
这实际上是关于SimpleXML和DOM(+XPath等)之间差异的相当简洁的总结,我必须记住这一点。 - IMSoP

-1

使用PHP自带的DomDocument非常简单。

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

之后,$oElement是一个DOMNodeList对象,您可以对其进行迭代。

要获取内容:

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

显然urun节点中没有内容,只有子节点。在DomNodeList中,$oElement包含urun节点的所有内容。您可以对其进行迭代。您可以在其中搜索其他节点。它包含urun的所有子节点。


这不是我的情况,我想要获取它而不带标签名。 - Mahmoud Ismail
所以你想要节点的内容? - Marcel
显然,第一个urun节点中没有内容。您只能通过迭代检索到的DOMNodeList来获取子节点。 - Marcel
我遇到了一个错误:致命错误:调用未定义的方法 getElementByTagName() - Mahmoud Ismail
代码示例中有一个错别字,已经进行了编辑。请查看PHP文档。您要求获取第一个urun节点,我们提供了获取第一个urun节点的示例。现在轮到您了,请使用它。Stack Overflow不是用来乞求完整可用的代码示例的。 - Marcel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接