GNU/Linux >> Znalost Linux >  >> Linux

Jak analyzovat XML a odstranit značky pomocí příkladů XPATH v Linuxu (Jak kombinovat více příkazů pomocí PIPE v Linuxu)

Tento tutoriál vysvětluje proces vytváření užitečných vícedílných příkazů kousek po kousku.

Abychom vytvořili složité příkazy v terminálu, musíme porozumět potrubí. Piping je v podstatě převzetí výstupu jednoho příkazu a jeho odeslání jinému příkazu jako vstupu. To se provádí pomocí | (potrubí) symbol.

Minulý měsíc mě malý projekt vyžadoval, abych opakovaně četl podobné soubory XML, abych poskytl testovací data pro jiný program. Musel bych to dělat tak často, že by bylo nepříjemné stahovat, ukládat, analyzovat a opakovat. Základní požadavky byly:

  1. Získejte XML z adresy URL
  2. Analyzujte XML a vyberte pouze dva atributy všech prvků
  3. Odstraňte štítky, aby zůstal pouze obsah
  4. Odeslat na standardní výstup

1. Dokažte, že příkazový řádek dokáže analyzovat XML

Minulý rok jsem pro skript použil knihovnu Ruby REXML::Xpath a vzpomněl jsem si, že na příkazovém řádku je k dispozici verze Perl. Můžete jej nainstalovat pomocí CPAN:

$ cpan XML::XPath

Použijme vzorový soubor zaměstnance, abychom si pohráli s myšlenkou. Otevřete tento soubor staff.xml v prohlížeči, otevřete jej v prohlížeči a uložte jako staff.xml.

Nyní máme náš příkaz xpath a soubor, se kterým si můžeme hrát.

Otestujte to jednoduchou cestou:

$ xpath employees.xml '/DIRECTORY/EMPLOYEE/FIRST_NAME'
­­ NODE ­­
<FIRST_NAME>Steven</FIRST_NAME>­­ NODE ­­
<FIRST_NAME>Susan</FIRST_NAME>­­ NODE ­­
<FIRST_NAME>Marigold</FIRST_NAME>­­ NODE ­­
...
<FIRST_NAME>Sunny</FIRST_NAME>­­ NODE ­­
<FIRST_NAME>Flo</FIRST_NAME>

Vynikající! Vytiskne atribut FIRST_NAME každého /EMPLOYEE na vybrané cestě. Jak ale vybereme více prvků XPath? Při pohledu na syntaxi XPath vidíme cestu. Kombinace výrazů XPath s | znak, vytvoříme výraz OR.

$ xpath employees.xml '/DIRECTORY/EMPLOYEE/ FIRST_NAME | /DIRECTORY/EMPLOYEE/LAST_NAME'
--­­ NODE ­­--
<FIRST_NAME>Steven</FIRST_NAME>­­-- NODE ­­--
<LAST_NAME>Sanguini</LAST_NAME>­--­ NODE ­--­
<FIRST_NAME>Susan</FIRST_NAME>­­-- NODE ­­--
<LAST_NAME>Aquilegia</LAST_NAME>--­­ NODE --­­
...
<FIRST_NAME>Flo</FIRST_NAME>­­-- NODE ­­--
<LAST_NAME>Lobalessia</LAST_NAME>

Všimněte si, zde | je interpretován jako operátor OR a nikoli přesměrování výstupu.

Také v tomto tvrzení vybíráme X i Y. Proč OR vybírá obojí? Vyhodnocuje každý uzel v dokumentu XML samostatně a pokud je uzel A nebo B, projde vyhodnocením a předá se na výstup.

2. Stáhněte si XML a odešlete na STDOUT

Tento další krok ve skutečnosti přijde dříve na příkazovém řádku a vytvoříme jej samostatně. Dávám přednost vytváření nejtěžších příkazů nebo příkazů typu „to nemůžete udělat“ jako důkaz konceptu. Bylo by zbytečné provádět práci s okolní příkazovou řádkou, pokud první krok nemůže fungovat.

cURL je výkonný příkaz pro HTTP interakce. Tyto příklady zvlnění vám pomohou začít správným směrem.

Určíme umístění a v případě potřeby provedeme přesměrování. K tomu použijte tuto možnost:-L ‘https://www.thegeekstuff.com/scripts/employees.xml’

Vypneme informační výstup cURL. A zadejte protokol GET. K tomu použijte tuto volbu:-s G

Pojďme tedy otestovat náš příkaz na adrese URL souboru, který jsme dříve stáhli:

$ curl -­s -­G -­L ' https://www.thegeekstuff.com/scripts/employees.xml'
<?xml version="1.0" encoding="UTF­8"?>
<DIRECTORY>
<EMPLOYEE>
<FIRST_NAME>Steven</FIRST_NAME>
<LAST_NAME>Sanguini</LAST_NAME>
<STORE_NUMBER>4</STORE_NUMBER>
<SHIFT>FIRST</SHIFT>
<AUM>$2.44</AUM>
<ID>031599</ID>
</EMPLOYEE>
..

Výchozí hodnota je STDOUT. Což je dobré, protože jej nyní přesměrujeme na XPath a odstraníme argument souboru:

$ curl ­-s -­G -­L ' https://www.thegeekstuff.com/scripts/employees.xml' | xpath \
'/DIRECTORY/EMPLOYEE/LAST_NAME | /DIRECTORY/EMPLOYEE/ID'
­--­ NODE ­­--
<LAST_NAME>Sanguini</LAST_NAME>­­-- NODE ­­--
<ID>031599</ID>­­ NODE ­­
<LAST_NAME>Aquilegia</LAST_NAME>­­-- NODE -- ­­
<ID>030699</ID>­­-- NODE ­­--
...
<LAST_NAME>Lobalessia</LAST_NAME>--­­ NODE --­­
<ID>022299</ID>

To vytváří očekávaný výstup. Skvělý! Nevím proč, ale XPath posílá „NODE“ na standardní chybu (STDERR). Ale možný důvod uvidíme později.

3. Odstraňte značky XML

Nyní musíme být schopni tyto štítky odstranit a získat pouze obsah. Sed je nejlepší nástroj pro provádění onthefly substitucí regulárních výrazů. Učení REGEX je mimo rozsah tohoto článku.

Další informace naleznete v naší sérii článků o regulárních výrazech Pythonu.

Při vytváření složitých příkazů s více argumenty a příznaky mi přijde nejlepší pracovat s jednoduchým příkladem, dokud to nedostanu tak akorát, a pak je vložit do kontextu se skutečnými argumenty. Zavedeme jednoduchý řetězec k sedu pro testovací substituci. Sed standardně funguje na STDIN.

$ echo "This<strong> is </strong>a test." | sed ­-re 's/i//g'
Ths<strong> s </strong>a test.

OK. To funguje. Nyní přepište vyhledávání, abyste nahradili značku.

$ echo "This<strong> is </strong>a test." | sed ­-re 's/<\w+>//g'
This is </strong>a test.

Dobrý. Odstraníme zavírací značku přidáním znaku „/“, který bude uvozen předponou „\“ a stane se volitelným příponou „?“

$ echo "This<strong> is </strong>a test." | sed ­re 's/<\/?\w+>//g'
This is a test.

Perfektní. Přesně to, co jsme očekávali.

4. Dát to všechno dohromady

Nyní, když jsme vytvořili jednotlivé části našeho příkazu, vložíme je dohromady v logickém pořadí spojeném | .

curl ­-s -­G -­L ' https://www.thegeekstuff.com/scripts/employees.xml' | \
xpath '/DIRECTORY/EMPLOYEE/LAST_NAME | /DIRECTORY/EMPLOYEE/ID ' | \
sed ­-re 's/<\/?\w+>//g'

Výstup:

Found 72 nodes:
--­­ NODE -- ­­
­--­ NODE ­­--
...
Sanguini031599Aquilegia030699...

A jé! Možná proto jsou tam značky „NODE“. Pokud to převedeme do souboru, text NODE nenásleduje. Jsou odeslány na standardní chybu (STDERR), ale můžeme je přesměrovat na STDOUT pomocí `2>&1` (vysvětlení) a použít sed náhradní `sed re 's/ NODE //g'` k odstranění stejným způsobem jako značky.

curl -­s -­G -­L 'https://www.thegeekstuff.com/scripts/employees.xml' | \
xpath '/DIRECTORY/EMPLOYEE/LAST_NAME | /DIRECTORY/EMPLOYEE/ID '
2>&1| sed -­re 's/­--­NODE--­­//g' | sed -­re 's/<\/?\w+>//g'

Výstup:

Found 72 nodes:
Sanguini
031599
Aquilegia
030699
...
Lobalessia
022299

Perfektní. Nyní, když pracuji na svém projektu, mohu rychle dostat ukázková data ze souborů XML na webu do STDOUT bez všech potíží s ukládáním souborů nebo spouštěním nějakého složitého softwaru. Můžeme to dokonce převést na `tail –n+3`, abychom odřízli ty první dva řádky odezvy.

Tento článek je jen jedním příkladem různých věcí, které můžete udělat, pokud se naučíte kombinovat více příkazů pomocí roury.


Linux
  1. Jak přenášet soubory mezi dvěma počítači pomocí příkazů nc a pv

  2. Jak používat příkazy „cat“ a „tac“ s příklady v Linuxu

  3. Linuxové příkazy – přehled a příklady

  1. Zkontrolujte místo na disku v Linuxu pomocí příkazů df a du

  2. Příkazy hlavy a ocasu v Linuxu vysvětleny s příklady

  3. Jak používat Pipes a Named Pipes v Linuxu (s příklady)

  1. Jak nastavit prioritu procesu Linux pomocí příkazů nice a renice

  2. Jak změnit prioritu procesu pomocí příkladů Linux Nice a Renice

  3. Jak přidat více tras v Linuxu pomocí příkladů příkazů ip