Neden bu PHP XPath ifadesini kullanarak istenen düğüm seçemiyorum?

4 Cevap php

Using PHP, SimpleXML and the xpath() function, I want to select a child node, starting from a certain point. Can you please help me? I know in this specific case I could use an expression starting with "//", but I want to learn the right way of selecting a child node. Thanks.

First try - Undefined offset: 0 hatası ile başarısız oluyor

$navXmlObject = simplexml_load_file("main_navigation.xml");
$tmpObject = $navXmlObject->website->xpath('title[@lang="fr"]'); 
echo($tmpObject[0]["label"]);

Second try, adding a slash - da aynı hata ile başarısız

$tmpObject = $navXmlObject->website->xpath('/title[@lang="fr"]'); 

XML dosyası

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <website id="MainWeb">
        <title lang="fr" label="Mon site Web" />        
        <title lang="en" label="My web site" />     
        <menuNodes>

            <menuNode id="Home">
                <menuNodeData lang="fr" label="Accueil" url="/fr/accueil/" />
                <menuNodeData lang="en" label="Home" url="/en/home/" />
            </menuNode>

            <menuNode id="Prod">

                <menuNodeData lang="fr" label="Produits" url="/fr/produits/" />
                <menuNodeData lang="en" label="Products" url="/en/products/" />

                <menuNode id="Shoe">
                    <menuNodeData lang="fr" label="Chaussures" url="/fr/produits/chaussures/" />
                    <menuNodeData lang="en" label="Shoes" url="/en/products/shoes/" />
                </menuNode>

            </menuNode>

            <menuNode id="Biog">
                <menuNodeData lang="fr" label="Biographie du fondateur" url="/fr/biographie/" />
                <menuNodeData lang="en" label="Biography of founder" url="/en/biography/" />
            </menuNode>

        </menuNodes>
    </website>
</root>

4 Cevap

Bu strongly Eğer yeni bir kararlı sürüme yükseltme ve onunla birlikte gelecek tüm yenilikleri zevk tavsiye edilir. Şimdi üzerinde birlikte olduğunu, kod çalışmıyor nedeni, beklediğiniz gibi SimpleXML böyle bir eski sürümü tam olarak davranmasına değil tam çünkü.

Eğer (saner, örneğin sonraki sürümleri ile karşılaştırıldığında) olmasını bekliyoruz nereye sorguları için bağlamsal düğüm değildir. Sadece mutlak bir XPath kullanmak için anlayış kolaylığı uğruna, benim görüşüme göre, daha kolay olurdu.

PHP 5.0.5 çalışmak (ve güncel sürümleri yapmak) bazı örnekler şunlardır:

$xmlObject->xpath("/root/website/title[@lang='fr']")
$xmlObject->xpath("./website/title[@lang='fr']")
$xmlObject->xpath("//website/title[@lang='fr']")
$xmlObject->xpath("website/title[@lang='fr']")

Çalışmalarında bir anahtar atmak için, buraya (henüz 5.0.5 sizin için çalışması gerekir) sadece aptal bir örnek:

$xmlObject->website->menuNodes->xpath("title[@lang='fr']")

göre w3

nodename | adında bir düğümün tüm alt düğümlerini seçer

W3Schools tavsiye oldukça iyi XPath tutorial hangi vardır.

Eğer söz mentionned her yerde belgedeki tüm <title/> öğeleri seçmek istiyorsanız, kullanabileceğiniz

//title

(to which you can add predicate such as [@lang="fr"])

  • XPath, // araçları "anywhere".
  • XPath ifadesi ile başlıyorsa // demek "anywhere in the document."
  • Tek bir / demek "at the root of the document." ile başlıyorsa
  • Herhangi bir bölü çizgisi ile başlamazsa Son olarak, eğer, bu demektir "under the context node."

Eğer ağacın yapısı değişmez biliyorsanız, <title/> elemanına kesin yolu olacaktır

/root/website[@kimlik="MainWeb"]/title[@lang="fr"]

Şimdi size ağacını yenkimliken ve muhtemelen diğer bazı düğüm altında <website/> düğüm hareket planı diyelim. Siz "adlı <website/> düğüm anywhere için bakmak ve onun alt olmalıdır <title/> düğümü bulalım" demek, olabilir XPath olurdu

//website[@kimlik="MainWeb"]/title[@lang="fr"]

Lastly, know that you can use the context node as the root of your search using a single dot "." For instance, using SimpleXML, you could look for a <title/> anywhere under <website/> using

$navXmlObject->website->xpath('.//title')

ÇÖZÜLDÜ!

Upgrading to the latest version of PHP solved the issue! I completely uninstalled PHP and Apache from my system and instead used Uniform Server - a portable PHP/Apache environment (http://uniformserver.com/)

Thanks to all for your help.