Fórum Root.cz
Hlavní témata => Software => Téma založeno: neregistrovany 25. 04. 2021, 22:18:55
-
mam nasledujici XML strukturu:
<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?
-
XPath výraz /main/groups/group[name='group2']/members vybere element members, který je uvnitř group, která obsahuje element name s obsahem group2.
-
Zvláštní. Tohle mi funguje:
xmlstarlet ed -s /main/groups/group[2]/members -t elem -n user -v newUser <data.xml
ale tohle ne:
xmlstarlet ed -s /main/groups/group[name='group2']/members -t elem -n user -v newUser <data.xml
-
No jasně, shell spolkl apostrofy. Tohle by mělo fungovat:
xmlstarlet ed -s "/main/groups/group[name='group2']/members" -t elem -n user -v newUser <data.xml
-
No jasně, shell spolkl apostrofy. Tohle by mělo fungovat:
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...
-
No jasně, shell spolkl apostrofy. Tohle by mělo fungovat:
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):
/root/server/host/groups/group[normalize-space(name)='lh']/members
-
No jasně, shell spolkl apostrofy. Tohle by mělo fungovat:
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):
/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
-
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.
-
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
-
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:
/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.
-
Tak uz vsechno funguje, moc diky za pomoc chlapi..