Fórum Root.cz

Hlavní témata => Software => Téma založeno: neregistrovany 25. 04. 2021, 22:18:55

Název: Zápis XPath pro XMLStarlet
Přispěvatel: neregistrovany 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?
Název: Re:xmlstarlet xpath
Přispěvatel: Filip Jirsák 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.
Název: Re:xmlstarlet xpath
Přispěvatel: Kit 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
Název: Re:xmlstarlet xpath
Přispěvatel: Kit 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
Název: Re:xmlstarlet xpath
Přispěvatel: neregistrovany 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...
Název: Re:xmlstarlet xpath
Přispěvatel: Filip Jirsák 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
Název: Re:xmlstarlet xpath
Přispěvatel: neregistrovany 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
Název: Re:Zápis XPath pro XMLStarlet
Přispěvatel: Ondrej Nemecek 26. 04. 2021, 12:53:12
Bílý znak (https://cs.wikipedia.org/wiki/B%C3%ADl%C3%BD_znak). Co se týče odstranění tak Vám tam schází to normalize-space.
Název: Re:Zápis XPath pro XMLStarlet
Přispěvatel: neregistrovany 26. 04. 2021, 13:17:11
Bílý znak (https://cs.wikipedia.org/wiki/B%C3%ADl%C3%BD_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
Název: Re:xmlstarlet xpath
Přispěvatel: Filip Jirsák 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.
Název: Re:Zápis XPath pro XMLStarlet
Přispěvatel: neregistrovany 27. 04. 2021, 23:52:55
Tak uz vsechno funguje, moc diky za pomoc chlapi..