Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: petr818 21. 06. 2019, 10:44:50

Název: Bash regular pro XML
Přispěvatel: 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):

Kód: [Vybrat]
<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     

Kód: [Vybrat]
             
   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ázev: Re:bash regular pro xml
Přispěvatel: Filip Jirsák 21. 06. 2019, 10:55:35
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…
Název: Re:bash regular pro xml
Přispěvatel: petr818 21. 06. 2019, 11:03:05
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
Název: Re:bash regular pro xml
Přispěvatel: listoper 21. 06. 2019, 11:08:33
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)
Název: Re:bash regular pro xml
Přispěvatel: Filip Jirsák 21. 06. 2019, 11:12:05
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.
Název: Re:bash regular pro xml
Přispěvatel: robin martinez 21. 06. 2019, 12:43:52
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 :)
Název: Re:bash regular pro xml
Přispěvatel: Kit 21. 06. 2019, 12:57:45
Kód: [Vybrat]
xmllint --xpath 'string(//property[@name="PROPETY_NAME"]/@value)' input.xml
Název: Re:bash regular pro xml
Přispěvatel: Daniel Novotný 21. 06. 2019, 12:57:51
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
Název: Re:bash regular pro xml
Přispěvatel: D.A. Tiger 21. 06. 2019, 13:13:07
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
Název: Re:bash regular pro xml
Přispěvatel: gill 21. 06. 2019, 13:20:54
Kód: [Vybrat]
xmllint --xpath '//property[@name="PROPETY_NAME"]/@value' file.xml | sed 's/value=/\n/g'
Název: Re:bash regular pro xml
Přispěvatel: gill 21. 06. 2019, 13:24:34
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.
Název: Re:bash regular pro xml
Přispěvatel: Kit 21. 06. 2019, 13:29:23
Kód: [Vybrat]
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í.
Název: Re:bash regular pro xml
Přispěvatel: Filip Jirsák 21. 06. 2019, 13:36:29
jde to, většina implementací regulárních výrazů podporuje rekurzivní matche.
To ale na parsování XML nestačí.
Název: Re:Bash regular pro XML
Přispěvatel: petr818 24. 06. 2019, 10:52:46
ten xmllint je fajn a vypada ze by fungoval, jen mam starou verzi co neumi xpath.
Název: Re:Bash regular pro XML
Přispěvatel: petr818 24. 06. 2019, 11:32:07
nakonec jsem preoste grepnul PROPETY_NAME s prepinacem -A 1 a ve vysledku nasel regularem http. snad to bude ok no.
Název: Re:Bash regular pro XML
Přispěvatel: Jiří Havel 24. 06. 2019, 11:48:06
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.
Název: Re:Bash regular pro XML
Přispěvatel: gill 24. 06. 2019, 12:57:36
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

Kód: [Vybrat]
xmllint --format file.xml | ...
Název: Re:Bash regular pro XML
Přispěvatel: gill 24. 06. 2019, 13:09:31
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
Název: Re:Bash regular pro XML
Přispěvatel: Kit 24. 06. 2019, 14:09:29
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.