Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Potreba za elegantnim resenjem sa XPath-om

[es] :: XML :: Potreba za elegantnim resenjem sa XPath-om

[ Pregleda: 3059 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

djordjeno
Srbija

Član broj: 35204
Poruke: 332
*.mobitel.si.

Sajt: www.mobitel.si


+42 Profil

icon Potreba za elegantnim resenjem sa XPath-om23.09.2008. u 09:28 - pre 189 meseci
Pozdrav,

Imam problem sa XPath-om kada mi je potrebno da vrati sve nodove koji sa odredjenim imenom. Nodovi sa imenom "node_name" se nalaze na razlicitim dubinama u XML-u.
Znam da vratim sve nodove sa odredjenim imenom preko rekurzivnih poziva, ali me interesuje da li postoji elegantno resenje kroz jedan XPath poziv.

Npr evo XML-a:
Code:

<root>
  <node_name>First name</node_name>
  <level1>
    <node_name>Second name</node_name>
  </level1>
  <level1>
    <level2>
      <node_name>Third name</node_name>
      <node_name>Fourth name</node_name>
    </level2>
    <node_name>Fourth name</node_name>
  </level1>
  <level1>
    <level2>
      <node_name>Fifth name</node_name>
      <level3>
        <node_name>Sixth name</node_name>
        <node_name>Seventh name</node_name>
      </level3>
    </level2>
    <node_name>Eigth name</node_name>
  </level1>
</root>

Znaci zeljeni XPath bi trebao da vrati 8 stringova sa vrednostima nodova.
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Potreba za elegantnim resenjem sa XPath-om23.09.2008. u 10:45 - pre 189 meseci
Mislim da ne može elegantnije od ovog:
Code:

//node_name

 
Odgovor na temu

djordjeno
Srbija

Član broj: 35204
Poruke: 332
*.mobitel.si.

Sajt: www.mobitel.si


+42 Profil

icon Re: Potreba za elegantnim resenjem sa XPath-om23.09.2008. u 12:51 - pre 189 meseci
Citat:
jablan: Mislim da ne može elegantnije od ovog:
Code:

//node_name

;)


Stvarno radi :) ali izgleda da nisam dobro napisao primer.
XML fajl koji treba da isparsiram je poveliki pa cu pokusati da napravim bolju kopiju na kome ne radi ova sintaksa (//node_name).


Evo popravljenog primera:
Code:

<?xml version="1.0"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <levels>
    <level0 xmlns="http://www.someurl.com/api/data">
      <level1>
        <node_name att1="1">
          <selection>as - 1</selection>
        </node_name>
      </level1>
    </level0>
    <level0 xmlns="http://www.someurl.com/api/data">
      <level1>
        <level2>
          <node_name>Third name</node_name>
          <node_name>Fourth name</node_name>
        </level2>
        <node_name att1="2">
          <selection>as - 2</selection>
        </node_name>
      </level1>
      <level1>
        <level2>
          <node_name>Fifth name</node_name>
          <level3>
            <node_name>Sixth name</node_name>
            <node_name>Seventh name</node_name>
          </level3>
        </level2>
        <node_name>Eighth name</node_name>
      </level1>
    </level0>
  </levels>
</root>


Kad na ovaj XML pustite "//node_name" nece naci nijedan element.

Dosao sam do zakljucka da kada se na level# nodu izbrise "xmlns" atribut pomenuta sintaksa sa "//" radi kako treba. Da li nekako moze da se naznaci u XPath-u da se ignorise xmlns attribut.

Hvala.
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Potreba za elegantnim resenjem sa XPath-om23.09.2008. u 14:27 - pre 189 meseci
Da bi XPath mečovao nod, mora da bude u istom nejmspesu. Iskreno, ne znam da li postoji način da specificiraš nejmspejs u XPath-u, proguglaj malo, a možda i ovde nađeš odgovor:

http://bobcat.webappcabaret.ne...ina/faq/xpath_01.htm#xpath_Q15

BTW, kad radiš sa velikim dokumentima, lakše je da koristiš neki parser SAX tipa (umesto DOM), pogotovu za ovaj tvoj slučaj kad ti je bitno ime noda, a ne putanja do njega.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Potreba za elegantnim resenjem sa XPath-om23.09.2008. u 16:01 - pre 189 meseci
Zapravo postoji resenje, ako hoces da vratis node odredjenog imena bez obzira na namespace u kojem je koristis * kao ime namespace-a u XPath-u:

Code:

//*:node_name


Ono sto je malo zeznuto je da vratis npr sve nodove istog imena koji pripadaju pod dva od 5 namespace-ova.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

gonadarian
Igor Popov
Youngculture
Beograd

Član broj: 14445
Poruke: 39
194.106.174.*

Sajt: gonadarian.info


Profil

icon Re: Potreba za elegantnim resenjem sa XPath-om24.09.2008. u 10:09 - pre 189 meseci
Ako imaš uticaj na strukturu XML fajla, pokušaj da izbegneš inline namespace definicije i prebaci ih u root element XMLa. Tu postavi namespace prefix i koristi ga dosledno u celom fajlu. Ako ne možeš da menjaš XML, a to ti je jedini namespace ignoriši ga pomoću metode iz prethodnog posta ili pomoću XPath funkcije local-name(). Ako ti je bitno da mečuješ taj konkretni namespace pogledaj upotrebu XPath funkcije namespace-uri(). Testirani primer:

Code:
//*[local-name()='node_name' and namespace-uri()='http://www.someurl.com/api/data']

 
Odgovor na temu

djordjeno
Srbija

Član broj: 35204
Poruke: 332
*.mobitel.si.

Sajt: www.mobitel.si


+42 Profil

icon Re: Potreba za elegantnim resenjem sa XPath-om24.09.2008. u 11:12 - pre 189 meseci

Citat:
gonadarian: Ako imaš uticaj na strukturu XML fajla, pokušaj da izbegneš inline namespace definicije i prebaci ih u root element XMLa. Tu postavi namespace prefix i koristi ga dosledno u celom fajlu. Ako ne možeš da menjaš XML, a to ti je jedini namespace ignoriši ga pomoću metode iz prethodnog posta ili pomoću XPath funkcije local-name(). Ako ti je bitno da mečuješ taj konkretni namespace pogledaj upotrebu XPath funkcije namespace-uri(). Testirani primer:

Code:
//*[local-name()='node_name' and namespace-uri()='http://www.someurl.com/api/data']


Nazalost nemam uticaj, a da imam sigurno ne bih inline stavljao namespace definicije.

Hvala svima na prethodnim odgovorima. Now it works :)
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Potreba za elegantnim resenjem sa XPath-om24.09.2008. u 18:58 - pre 189 meseci
Citat:
djordjeno: Nazalost nemam uticaj, a da imam sigurno ne bih inline stavljao namespace definicije.


Nema potrebe za bezanjem od online namespace-ova, oni su veoma efikasan mehanizam za injekciju dodatnog sadrzaja u XML bez pravljenja problema xpath logici koja radi sa default namespace-om iz roota, sto je vrlo verovatno i razlog zasto ti je XML tako formiran, mozda ces u nekoj sledecoj iteraciji dobijati xml sa level0 tagovima iz mesovitih namespace-ova sa razlicitim podformatima.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

[es] :: XML :: Potreba za elegantnim resenjem sa XPath-om

[ Pregleda: 3059 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.