C# týden ITnetwork Flashka zdarma
Akce! Pouze tento týden sleva až 80 % na kurzy C# .NET. Lze kombinovat s akcí 50 % bodů navíc na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!

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

Aktivity (2)
Avatar
tbartolen
Člen
Avatar
tbartolen:7. března 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. března 7:39
Navštiv www.fb.com/skkelticz
Avatar
tbartolen
Člen
Avatar
tbartolen:7. března 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. března 9:18
Navštiv www.fb.com/skkelticz
Avatar
Tomáš Novotný:7. března 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. března 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. března 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. března 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.