php xpath selecteer op value

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 15:00

Saven

Administrator

Topicstarter
Ik heb een tijdje terug een scriptje geschreven dat wat gegevens uit een XML replacet aan de hand van een <element>value</element> (aan de hand van een element value). Dat ging allemaal prima. Nu is er echter een aangepaste versie, met een ander pad naar het element, maar ik krijg het niet aan de praat :X

XML:
1
2
3
4
5
6
7
8
9
10
11
12
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:g="http://base.google.com/ns/1.0">
<entry>
<g:id>23423423</g:id>
<group_id>9589859</group_id>
<g:image_link>
<![CDATA[
http://website.com/oldimage.jpg
]]>
</g:image_link>
........
</entry>
...........


Vroeger moest ik op g:id controleren, dat deed ik zo:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        $data = @simplexml_load_file($this->externalUrl);

        if ($data !== false)
        {
            foreach ($this->replaces as $id => $replace)
            {
                $result = array();
                $data->registerXPathNamespace('g', 'http://base.google.com/ns/1.0');

                $result = $data->xpath('/rss/channel/item[g:id="' . $id . '"]');

                if (!empty($result))
                {
                    $result[0]->image_link = $replace[0];
                }
            }
        }


Nu moet ik echter op de <group_id> waarde controleren en vervangen.. Simpel dacht ik zo:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$data = @simplexml_load_file($this->externalUrl);

        if ($data !== false)
        {
            foreach ($this->replaces as $id => $replace)
            {
                $result = array();
                $data->registerXPathNamespace('g', 'http://base.google.com/ns/1.0');

                $result = $data->xpath('/rss/channel/item[g:id="' . $id . '"]');

                if (!empty($result))
                {
                    $result[0]->image_link = $replace[0];
                }
                else
                {
                    $result = $data->xpath('/feed/entry[group_id="' . $id . '"]');
    
                    if (!empty($result))
                    {   
                        // Komt nooit in deze if terecht
                        $result[0]->image_link = $replace[0];
                    }
                }
            }
         }

Maar hij belandt nooit in de tweede if(!empty($result))

Terwijl alles volledig hetzelfde is, behalve het pad en het element waar ik op moet checken. Heeft dit misschien te maken met 2 xmlns's in de <feed> tag? Lijkt me sterk, aangezien ik de URL gewoon opgeef. Alle voorbeelden die ik online kon vinden komen op hetzelfde neer, daarom werkt het bij de 'oude' feed in de 1e if wel. Waarom het dan niet in de tweede werkt snap ik dan weer totaal niet. Iemand enig idee?

Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Klopt het dat je 1e xpath is:
/rss/channel/item
, en je 2e:
/feed/entry

?

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 15:00

Saven

Administrator

Topicstarter
Guillome schreef op dinsdag 29 september 2015 @ 16:22:
Klopt het dat je 1e xpath is:
/rss/channel/item
, en je 2e:
/feed/entry

?
Ja klopt! De eerste die is van de 'oude' opmaak van de feed, inmiddels is er een nieuwe versie van de feedopbouw uit (zie de startpost) dus van de tweede valt 'ie onder <feed><entry>..</entry></feed>

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Is het probleem niet dat je de default namespace (xmlns) over het hoofd ziet? Je kunt het even testen met /*[name()='feed']/*[name()='entry']...

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 15:00

Saven

Administrator

Topicstarter
pedorus schreef op dinsdag 29 september 2015 @ 20:54:
Is het probleem niet dat je de default namespace (xmlns) over het hoofd ziet? Je kunt het even testen met /*[name()='feed']/*[name()='entry']...
Hmm daar zou je best wel eens in de richting kunnen zitten, maar ik snap helaas niet helemaal wat je bedoelt.

Ik heb een
code:
1
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:g="http://base.google.com/ns/1.0">

een g: namespace en de default, maar hoe benader ik precies die default in mijn xpath query?

Aangezien ik namelijk $data->registerXPathNamespace('g', 'http://base.google.com/ns/1.0'); doe,
maar tevens verder werk vanaf $data.

Ik moet een g:image_link vervangen, maar checken op een default namespace element (group_id)

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ik zou http://www.w3.org/2005/Atom registreren als a, en dan overal a: voor plakken (of g: voor die namespace). Maar hoe je het beste met default namespaces kan omgaan hier hangt ook van de xpath implementatie af.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • Saven
  • Registratie: December 2006
  • Laatst online: 15:00

Saven

Administrator

Topicstarter
pedorus schreef op dinsdag 29 september 2015 @ 21:07:
Ik zou http://www.w3.org/2005/Atom registreren als a, en dan overal a: voor plakken (of g: voor die namespace). Maar hoe je het beste met default namespaces kan omgaan hier hangt ook van de xpath implementatie af.
Hm goed idee, net geprobeerd, maar geen effect helaas. Heb verschillende varianten geprobeerd (met en zonder a: in de xpath() functie..

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
            foreach ($this->replaces as $id => $replace)
            {
                $result = array();
                $data->registerXPathNamespace('g', 'http://base.google.com/ns/1.0');
                $data->registerXPathNamespace('a', 'http://www.w3.org/2005/Atom');

                $result = $data->xpath('/rss/channel/item[g:id="' . $id . '"]');

                if (!empty($result))
                {
                    //unset( $result[0]->image_link);

                    $result[0]->image_link = $replace[0];
                }
                else
                {
                    //Poging 2
                    $result2 = $data->xpath('/feed/entry[a:group_id="' . $id . '"]');
    
                    if (!empty($result2))
                    {
                        $this->error = 'second not empty';
                        return false;
                        //komt nog steeds niet in deze if
    
                        $result2[0]->image_link = $replace[0];
                    }
                }
            }

  • pedorus
  • Registratie: Januari 2008
  • Niet online
het lijkt mij /a:feed/a:entry[a:group_id=...]

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten

Pagina: 1