【问题标题】:How i can get first child element from xml?我如何从 xml 中获取第一个子元素?
【发布时间】:2017-03-24 07:24:28
【问题描述】:

我如何在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代码。
  • 第一个元素是?
  • 第一个元素以标签名称urun开始
  • 你可以破坏你的foreach。第一个元素将被处理,break 将跳过其他元素。

标签: php xml children simplexml


【解决方案1】:

除非我误解了这个问题(这是可能的,你不是很清楚),否则你对所有子元素都有一个循环:

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

将其更改为仅访问第一个子元素真的很简单:

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

【讨论】:

    【解决方案2】:

    在 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 级别 3 中,具有子节点的节点具有 firstElementChild 属性。

    【讨论】:

    • XPath 总是像正则表达式一样让我印象深刻:功能强大,但在很多情况下过度杀伤力。在这种情况下,您只需在 SimpleXML 中获取$root-&gt;children()[0];不过,DOM 可能更复杂。
    • 你是对的。我只是一直在考虑节点,有时会忘记 SimpleXML 更像是一个元素树。
    • 这实际上是对 SimpleXML 和 DOM(+ XPath 等)之间区别的一个非常简洁的总结,我必须记住这一点。
    【解决方案3】:

    使用 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 获得的所有子节点。

    【讨论】:

    • 这不是我的情况,我想得到它没有标签名称
    • 所以你想要节点的内容?
    • 显然第一个urun节点没有内容。只有通过遍历检索到的 DOMNodeList 才能获得子节点。
    • 我有一个错误:Fatal error: Call to a member function getElementByTagName()
    • 代码示例中有错字。编辑它。只需查看 PHP 文档即可。您要求获取第一个 urun 节点。您有一个获取第一个 urun 节点的示例。现在由你决定。用它。 Stack Overflow 不是为了乞求完整的工作代码示例。
    猜你喜欢
    • 2015-11-22
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 2020-09-27
    • 2021-05-16
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多