Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: petr818 21. 06. 2019, 10:44:50
-
Ahoj, resim tu jednoduchy xml parser v bashi. potrebuju abych dostal hodnotu ve value podle name.
kus XML co me zajima (muze byt libovolne vnorenej v dalsich tazich):
<property name="PROPETY_NAME" value="https://url.com/cesta/"/>
# bohuzel obcas i s novym radkem
<property name="PROPETY_NAME"
value="https://url.com/cesta/"/>
nejdriv jsem zkusil jen
echo "$file_content" | grep "PROPETY_NAME" | grep -o 'http.://.*\"' | sed 's/.$//' | sed -n '1p'
coz fungovalo ale bohuzel narazilo to pokud byl tag na vice radcich
tak jsem zkusil pres regular
echo "$file_content" | sed -r -e "/(?:<property name=\"PROPETY_NAME\" value=\")(.*?)(?:\"\/>)/g";
ale to mi moc nefunguje.
nejaky napad prosim?
-
Nápad je jediný: neparsujte XML pomocí regulárních výrazů, protože to nejde. Teď jste narazil na zalomení řádků, pak narazíte na komentáře, entity, CDATA…
-
jo to je mi jasny, taky se mi to moc nezda, ale potrebuju jen tu jednu jedinou hodnotu z jednoho tagu, vic nic takze mi to neprijde zas tak zly
-
Treba by slo to napred prohnat nejakym "zkraslovacem"
https://stackoverflow.com/questions/16090869/how-to-pretty-print-xml-from-the-command-line (https://stackoverflow.com/questions/16090869/how-to-pretty-print-xml-from-the-command-line)
-
Raději použijte nějakou utilitu, která vám umožní použít XPath. Bude to mnohem jednodušší na použití a bude to fungovat. Napadá mne třeba XML Shell (http://www.xmlsh.org/), vygooglit se toho dá víc.
-
A ja se pridam jako dalsi: vyreste to jinak, prevazne, pokud vasi praci po vas nekdo bude prebirat. Ted jsem prebral jednu aplikaci, kde si typek takhle presne resil XML vystup z MySQL a samozrejme po zmene verze se uplne zmenil vystup, takze se cela aplikace dojebala. Pak si to jak idiot cely opravujte po lidech, ktery jsou neschopny a hrajou si na velky programatory :)
-
xmllint --xpath 'string(//property[@name="PROPETY_NAME"]/@value)' input.xml
-
XML není jazyk regulární, ale vyššího řádu (AFAIK bezkontextový?) - nejde tedy parsovat regulárními výrazy, ale nějaké řádkové parsery by se v repozitáři vaší distribuce měly povalovat: nějaké knihovny má tuším také Python ve své standardní instalaci
-
Ja vim, ze pisete jaoko pozadavek BASH, ale presto Vam to muze trochu pomoci :
http://lua-users.org/wiki/LuaXml
(Classic Lua Verzion)
Osobne jsem to na tak jednochy XML pouzil nekolikrat a nebyl s tim zadny problem. Muzte to pouzit jako tu navrhovanou utilitku, anebo se tim aspon inspirovat.
A nebo se naucit jazyk Lua a pracovat s nim :-D
-
xmllint --xpath '//property[@name="PROPETY_NAME"]/@value' file.xml | sed 's/value=/\n/g'
-
Nápad je jediný: neparsujte XML pomocí regulárních výrazů, protože to nejde. Teď jste narazil na zalomení řádků, pak narazíte na komentáře, entity, CDATA…
jde to, většina implementací regulárních výrazů podporuje rekurzivní matche.
-
xmllint --xpath '//property[@name="PROPETY_NAME"]/@value' file.xml | sed 's/value=/\n/g'
Má to jednu vadu na kráse: Pokud atribut bude obsahovat nějakou znakovou entitu, tak nebude dekódována. Jinak dobré řešení.
-
jde to, většina implementací regulárních výrazů podporuje rekurzivní matche.
To ale na parsování XML nestačí.
-
ten xmllint je fajn a vypada ze by fungoval, jen mam starou verzi co neumi xpath.
-
nakonec jsem preoste grepnul PROPETY_NAME s prepinacem -A 1 a ve vysledku nasel regularem http. snad to bude ok no.
-
nakonec jsem preoste grepnul PROPETY_NAME s prepinacem -A 1 a ve vysledku nasel regularem http. snad to bude ok no.
Nebude. Jednoho krásného dne se to totálně rozbije, když se v tom xmlku objeví pár naprosto legálních konců řádku navíc. A podle mých zkušeností se to nejspíš rozsype tak, že bude trvat několik dní než se vůbec najde, odkud ta chyba vyšla.
Z celého srdce ti přeji abys to byl ty, kdo to pak bude muset řešit.
-
nakonec jsem preoste grepnul PROPETY_NAME s prepinacem -A 1 a ve vysledku nasel regularem http. snad to bude ok no.
Nebude. Jednoho krásného dne se to totálně rozbije, když se v tom xmlku objeví pár naprosto legálních konců řádku navíc. A podle mých zkušeností se to nejspíš rozsype tak, že bude trvat několik dní než se vůbec najde, odkud ta chyba vyšla.
Z celého srdce ti přeji abys to byl ty, kdo to pak bude muset řešit.
to vyresi
xmllint --format file.xml | ...
-
ten xmllint je fajn a vypada ze by fungoval, jen mam starou verzi co neumi xpath.
tak zkuste treba xgrep nebo xml_grep z xml-twig-tools, podobnych programu existuje spousta
-
ten xmllint je fajn a vypada ze by fungoval, jen mam starou verzi co neumi xpath.
Bylo by dobré povýšit tu verzi, protože xmllint má mnoho dalších užitečných vlastností, které se budou hodit pro zpracování.
Ještě tu nebyly zmíněny nástroje xqilla, xsltproc a xmlstarlet, které se k tomuto účelu také dají použít.