Slevový týden - Květen Office week
Pouze tento týden sleva až 80 % na e-learning týkající se MS Office
30 % bodů zdarma na online výuku díky naší Slevové akci!

Diskuze: xpath přístup k siblingovi při podmíněném výběru textu?

Aktivity (2)
Avatar
tbartolen
Člen
Avatar
tbartolen:7.3.2019 7:39

Ahoj, mám takovou potíž s XML a nevím, zda to, co chci udělat je vůbec fyzicky možné....potřeboval bych trochu poradit.
Mám takovouto strukturu XML:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <a xmlns="#">
             <b>
                <c>
                   <d>dd</d>
                   <e>ee</e>
                   <f>ff</f>
                   <g>gg</g>
                </c>
                <c>
                   <d>ddd</d>
                   <e>eee</e>
                   <f>fff</f>
                   <g>ggg</g>
                </c>
                <c>
                   <d>dddd</d>
                   <e>eeee</e>
                   <f>ffff</f>
                   <g>gggg</g>
                </c>
             </b>
       </a>
     </soap:Envelope>

Podmínka, kterou teď používám, vypadá nějak takhle...pokud <f> obsahuje určitý string, tak se mi uloží do proměné result:

$result = $xml->xpath("//*[text()[contains(.,'f')]]");

Z čehož dostávám tohle pole:

array (3)
  0 => SimpleXMLElement #f4ff
     0 => "ff" (2)
  1 => SimpleXMLElement #617e
     0 => "fff" (3)
  2 => SimpleXMLElement #863a
     0 => "ffff" (4)

Potud je vše v pořádku, teď ale nastává problém.
Potřebuju hodnotu <d>, pokud <f> obsahuje určitý textový řetězec, a potřebuji to dostat do jednoho pole takto:

array (3)
     0 => SimpleXMLElement #f4ff
        0 => "dd" (2)
        1 => "ff" (2)
     1 => SimpleXMLElement #617e
        0 => "ddd" (3)
        0 => "fff" (3)
     2 => SimpleXMLElement #863a
        0 => "ffff" (4)
        0 => "ffff" (4)

Zkusil jsem: Zkoušel jsem si hrát s následujícím siblingem a spojit to do jednoho příkazu, ale to je vždy následující sibling, není to tak, že se podívá na jakéhokoliv siblinga, což je pro mě problém

Chci docílit: Jde o filtraci dat. JS mi posílá dotaz v podobě stringu a já se snažím v XML na základě toho dotatazu který dostanu přes HTTP request zjistit, zda XML obsahuje určitou položku <f> a jaká je k ní přiřazena hodnota <d>. Měl jsem to celé řešené na client side pomocí select2, ale bohužel některá zařízení (především low end telefony) s tím nedokažou kapacitně pracovat, proto se snažím převést tu práci na server.

Odpovědět
7.3.2019 7:39
Navštiv www.fb.com/skkelticz
Avatar
tbartolen
Člen
Avatar
tbartolen:7.3.2019 9:18

Odpověď zní takto:

$result = $xml->xpath("//*[text()[contains(.,'test')]]/parent::*");

Děkuji všem co se nad tím na chvilku zamysleli

Akceptované řešení
+5 Zkušeností
Řešení problému
Nahoru Odpovědět
7.3.2019 9:18
Navštiv www.fb.com/skkelticz
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Tomáš Novotný:7.3.2019 9:23

ahoj,
přijde mi, že to dělá trochu něco jiného než popisuješ...do výsledku vloží text, který obsahuje 'f' ... nikoliv textový obsah <f>

Nahoru Odpovědět
7.3.2019 9:23
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
tbartolen
Člen
Avatar
Odpovídá na Tomáš Novotný
tbartolen:7.3.2019 9:27

Asi jsem to špatně napsal. Jde mi o to, aby vyhledávalo všechny textové řetězce obsashující určitou hodnotu zadanou z inputu....to znamená, aby vrátilo všechny řetězce, které obsahují "f" ...což tohle splňuje

Nahoru Odpovědět
7.3.2019 9:27
Navštiv www.fb.com/skkelticz
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.