Zápis XPath pro XMLStarlet

Zápis XPath pro XMLStarlet
« kdy: 25. 04. 2021, 22:18:55 »
mam nasledujici XML strukturu:

Kód: [Vybrat]
<main>
 <groups>
  <group>
   <members>
    <user>a</user>
    <user>b</user>
    <user>c</user>
   </members>
   <name>group1</name>
  </group>
  <group>
   <members>
    <user>a</user>
   </members>
   <name>group2</name>
  </group>
  <group>
   <members>
    <user>1</user>
    <user>2</user>
    <user>3</user>
   </members>
   <name>group3</name>
  </group>
 </groups>
</main>

a snazim se pomoci 'xmlstarlet ed -s' vlozit noveho usera do 'group2'. Teoreticky predpokladam ze bude treba na zaklade hledani stringu v 'name' urcit o kolikaty 'group' element od zacatku jde a do jeho subelementu 'members' pak usera pridat, ale nedokazu to zapsat do xpath. Poradi nekdo?
« Poslední změna: 26. 04. 2021, 08:56:15 od Petr Krčmář »


Re:xmlstarlet xpath
« Odpověď #1 kdy: 25. 04. 2021, 22:56:21 »
XPath výraz /main/groups/group[name='group2']/members vybere element members, který je uvnitř group, která obsahuje element name s obsahem group2.

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:xmlstarlet xpath
« Odpověď #2 kdy: 25. 04. 2021, 23:07:37 »
Zvláštní. Tohle mi funguje:
Kód: [Vybrat]
xmlstarlet ed -s /main/groups/group[2]/members -t elem -n user -v newUser <data.xml
ale tohle ne:
Kód: [Vybrat]
xmlstarlet ed -s /main/groups/group[name='group2']/members -t elem -n user -v newUser <data.xml

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:xmlstarlet xpath
« Odpověď #3 kdy: 25. 04. 2021, 23:23:52 »
No jasně, shell spolkl apostrofy. Tohle by mělo fungovat:
Kód: [Vybrat]
xmlstarlet ed -s "/main/groups/group[name='group2']/members" -t elem -n user -v newUser <data.xml

Re:xmlstarlet xpath
« Odpověď #4 kdy: 26. 04. 2021, 10:28:54 »
No jasně, shell spolkl apostrofy. Tohle by mělo fungovat:
Kód: [Vybrat]
xmlstarlet ed -s "/main/groups/group[name='group2']/members" -t elem -n user -v newUser <data.xml

Na uvedenem vyseku dat (poslal jsem kvuli privatnim udajum jen cast configu) to funguje, ale na celem konfiguraku ne. Posilam tedy cely config https://pastebin.com/1MvCyNGW

Pokudil jsem se to adaptovat na cely config, ale neuspesne:
xml ed -s "/root/server/host/groups/group[name='lh']/members" -t elem  -n user -v newuser abyss.conf | xidel -s -e "/root/server/host/groups/group[name='lh']/members" --data=-

(kvuli snadnejsi kontrole vytupu pri pokusovani to pajpuju do xidela ktery vypisuje cleny skupiny lh)

BTW: Pri experimentovani jsem buhviproc zmenil i nazvy skupin a useru, plati tedy ta posledni verze, aby to nekoho nematlo...
« Poslední změna: 26. 04. 2021, 10:32:38 od neregistrovany »


Re:xmlstarlet xpath
« Odpověď #5 kdy: 26. 04. 2021, 10:41:06 »
No jasně, shell spolkl apostrofy. Tohle by mělo fungovat:
Kód: [Vybrat]
xmlstarlet ed -s "/main/groups/group[name='group2']/members" -t elem -n user -v newUser <data.xml

Na uvedenem vyseku dat (poslal jsem kvuli privatnim udajum jen cast configu) to funguje, ale na celem konfiguraku ne. Posilam tedy cely config https://pastebin.com/1MvCyNGW

Pokudil jsem se to adaptovat na cely config, ale neuspesne:
xml ed -s "/root/server/host/groups/group[name='lh']/members" -t elem  -n user -v newuser abyss.conf | xidel -s -e "/root/server/host/groups/group[name='lh']/members" --data=-

(kvuli snadnejsi kontrole vytupu pri pokusovani to pajpuju do xidela ktery vypisuje cleny skupiny lh)

BTW: Pri experimentovani jsem buhviproc zmenil i nazvy skupin a useru, plati tedy ta posledni verze, aby to nekoho nematlo...
V tom odkazovaném XML není název skupiny „lh“, ale je to něco jako „\s\s\s\slh\s\s\s“, tj. je tam kolem toho textu spousta bílých znaků. Zkusil bych tedy tenhle XPath (je tam přidána funkce normalize-space):

Kód: [Vybrat]
/root/server/host/groups/group[normalize-space(name)='lh']/members

Re:xmlstarlet xpath
« Odpověď #6 kdy: 26. 04. 2021, 12:37:40 »
No jasně, shell spolkl apostrofy. Tohle by mělo fungovat:
Kód: [Vybrat]
xmlstarlet ed -s "/main/groups/group[name='group2']/members" -t elem -n user -v newUser <data.xml

Na uvedenem vyseku dat (poslal jsem kvuli privatnim udajum jen cast configu) to funguje, ale na celem konfiguraku ne. Posilam tedy cely config https://pastebin.com/1MvCyNGW

Pokudil jsem se to adaptovat na cely config, ale neuspesne:
xml ed -s "/root/server/host/groups/group[name='lh']/members" -t elem  -n user -v newuser abyss.conf | xidel -s -e "/root/server/host/groups/group[name='lh']/members" --data=-

(kvuli snadnejsi kontrole vytupu pri pokusovani to pajpuju do xidela ktery vypisuje cleny skupiny lh)

BTW: Pri experimentovani jsem buhviproc zmenil i nazvy skupin a useru, plati tedy ta posledni verze, aby to nekoho nematlo...
V tom odkazovaném XML není název skupiny „lh“, ale je to něco jako „\s\s\s\slh\s\s\s“, tj. je tam kolem toho textu spousta bílých znaků. Zkusil bych tedy tenhle XPath (je tam přidána funkce normalize-space):

Kód: [Vybrat]
/root/server/host/groups/group[normalize-space(name)='lh']/members

Super, to funguje! Co je prosim za ASCII "bily znak"? Zkousel jsme v PSpadu dat "zobrazit netisknutelne znaky", ale vidim tam jen formatovaci tabulatory....

Jeste se pokousim udelat odstraneni toho pridaneho uzivatele ze skupiny ale taky se nedari:

xmlstarlet ed -d "/root/server/host/groups/group[name='lh']/members/user('newuser')" abyss.conf

Re:Zápis XPath pro XMLStarlet
« Odpověď #7 kdy: 26. 04. 2021, 12:53:12 »
Bílý znak. Co se týče odstranění tak Vám tam schází to normalize-space.
« Poslední změna: 26. 04. 2021, 12:55:20 od Ondrej Nemecek »

Re:Zápis XPath pro XMLStarlet
« Odpověď #8 kdy: 26. 04. 2021, 13:17:11 »
Bílý znak. Co se týče odstranění tak Vám tam schází to normalize-space.

Aha, takze ty zvyraznovaci tabulatory. Ale u toho mazani mi to pise "Invalid expression", takze to bilejma znakama nebude

Re:xmlstarlet xpath
« Odpověď #9 kdy: 26. 04. 2021, 13:25:57 »
Super, to funguje! Co je prosim za ASCII "bily znak"?
Není to jeden znak, ale souhrnné označení pro všechny znaky, které vytvářejí prázdné (bílé) místo – různé mezery, tabulátory, konce řádků…


xmlstarlet ed -d "/root/server/host/groups/group[name='lh']/members/user('newuser')" abyss.conf
Jednak tam chybí to normalize-space. Jednak tam máte user('newuser'), což znamená, že se pokoušíte volat funkci user, a taková v XPath neexistuje. Pokud chcete vybaret element, který jako text obsahuje 'newuser, bude to:

Kód: [Vybrat]
/root/server/host/groups/group[normalize-space(name)='lh']/members/user[normalize-space(.)='newuser']
Tečka je zkratka pro aktuální uzel. Stejně jako v případě toho name se uzel v případě potřeby převede na string tak, že se vezme jenom jeho textový obsah.

V hranatých závorkách je podmínka, kterou musí příslušný uzel splnit, aby byl zařazen do výběru.

Re:Zápis XPath pro XMLStarlet
« Odpověď #10 kdy: 27. 04. 2021, 23:52:55 »
Tak uz vsechno funguje, moc diky za pomoc chlapi..