命令列xml處理
就像我不願說的那樣,xml工具還沒有達到類似unix的命令列中可用的文字實用程式的便利程度。 對於面向行的,空格或逗號分隔的文字檔案,使用sed,grep,xargs,wc,cut,pipe和短殼指令碼的巧妙組合可以完成的工作非常令人驚訝。
我認為,xml並不是天生就可以抵抗平面文字檔案所享受的模組化處理。 xml開發人員只需要從經驗中學習將xml工具組成元件的最佳方法。 例如,在編寫本技巧時,我想到了一些現實的示例任務。 但是我發現,即使是那些具有命令列功能的工具也尚未學會相互配合。 使用多種工具並非難事,只需要一點包裝即可。
值得注意的乙個事實是,相當多的人已經編寫了類似的簡單工具的各種程式語言版本。 每個版本的行為略有不同,但是它們都傾向於完成相同的總體任務。 在本文中,我將介紹xml_indexer,xmlcat和xpath工具; 前兩個來自我的gnosis實用程式,最後乙個是由matt sergeant編寫的perl模組(從cpan獲取)。
我對xml_indexer(見先前寫入相關資訊 ),它通過自己的xpath建立的xml文件中的詞的索引。 例如,您可以使用以下內容建立索引,然後搜尋xml文件:
清單1.在xpath上建立索引和搜尋
% xml_indexer chap.xml
% indexer events were
/users/dqm/chap.xml::/chapter/sect1[2]/sect2[1]/para[1]
/users/dqm/chap.xml::/chapter/sect1[2]/sect2[4]/para[3]
1 files matched wordlist: ['events', 'mostly']
processed in 0.062 seconds (slicedzpickleindexer)
這些命令顯示xml文件chap.xml中的元素,其中包含單詞「事件」和「是」(不一定按順序或接近)。 如果將其他xml文件新增到索引,則匹配的匹配項也會出現。 順便說一下,即使索引了多個文件,新的搜尋也幾乎是即時的。
雖然它告訴您一點點資訊,即單詞出現在特定文件中的特定xpath上,但是搜尋的重點通常是檢視(或進一步處理)實際內容是否匹配。 為此,您需要使用命令列xpath工具。 我已經安裝了perl的xml :: xpath,我喜歡它的行為。
您可以將發現的xpath剪下並貼上到xpath工具中。 例如:
清單2.手動檢視xpath
% xpath chap.xml '/chapter/sect1[2]/sect2[4]/para[3]'
found 1 nodes:
-- node --
it is not particularly remarkable that...
...
這表明這些工具具有很好的模組化。 而且,如果傳遞給xpath的xpath包含萬用字元,則它可能匹配的不僅是乙個節點。 不幸的是,indexer的輸出沒有正確的形式傳遞給xpath; 為了自動檢視具有匹配單詞的節點,索引器使用「 ::」將檔名與xpath分開,並且xpath一次僅檢視乙個xpath。 你可以做得更好。
清單3. find-xml-elements
#!/bin/sh
for hit in `indexer $@ 2> /dev/null`
do echo $hit | sed 's/::/ /' > loc.tmp
cat loc.tmp | xargs xpath 2> /dev/null
echo
done
rm loc.tmp
與其他設計良好的命令列工具一樣,索引器和xpath將資訊訊息傳送到stderr,並將實際結果傳送到stdout。 對於我的指令碼,我對stderr訊息不感興趣。 現在,我可以很容易地找到其**現單詞列表的所有節點:
清單4.在xml元素中搜尋單詞
% find-xml-elements events were
lest we forget some events in a recent decade...
...salem and by huac.
it is not particularly remarkable that...
...being uncovered.
到目前為止,一切都很好。 搜尋輸出一系列xml**片段,其中每個頂級元素都包含搜尋到的單詞。 但是,結果通常不是很完善的xml文件,因為它是多重根的。
分析xml資料的挑戰之一是xml文件可能包含與其語義內容無關的格式變化:可以忽略某些空格,在解析過程中丟棄屬性的順序,空元素可能是自封閉的或具有空白結束標籤,然後可以幾種不同的方式對實體進行編碼。 實際上,即使從解析器的角度來看,也不能忽略很多空白,但從應用程式的角度來看,它們卻是微不足道的。 漂亮的換行符和縮排對人們很有用,許多應用程式(可選)執行這種樣式設定。
已經編寫了大量工具以語義上有用的方式比較xml文件。 他們中的大多數人都有明顯的名字,例如xmldiff(使用google查詢各種程式語言的版本)。 xml文件的這種比較的基礎是每個文件的布局的規範化 。 一旦對xml文件的精確呈現做出了靈活的演算法決策,就可以輕鬆地將語義相似的文件與diff之類的通用工具進行比較。
我使用我編寫的python指令碼xmlcat。 該工具並不複雜-它的行為很像標準的cat實用程式-但可以在此過程中規範化xml文件。 我喜歡xmlcat的原因不止像xmlpp類似的工具(見相關資訊 )的是,它補充說,年代由web瀏覽器山貓靈感的選項。 如果將--dump
引數傳遞給xmlcat,則它僅輸出xml文件的文字內容,從而消除標籤(使用垂直空格是一種相當不錯的方式)。 對於面向資料的xml,此功能幾乎沒有用,但是對於標記的散文來說,它很方便。
如果您在散文的xml文件中搜尋內容詞,則很可能您對內容感興趣的多於標記。 使用xmlcat --dump
過濾正是刪除不需要的xml標籤的訣竅。 但是,將find-xml-elements的輸出直接傳遞到xmlcat並不完全正確,因為find-xml-elements的輸出不是乙個完整的格式良好的xml文件(如前所述,它是片段)。 乙個簡短的shell指令碼解決了這個問題:
清單5. find-xml-text
#!/bin/sh
for hit in `indexer $@ 2> /dev/null`
do echo $hit | sed 's/::/ /' > loc.tmp
cat loc.tmp | xargs xpath 2> /dev/null | xmlcat --dump
echo
done
rm loc.tmp
find-xml-text的輸出可與標準文字實用程式很好地配合。 例如,我想顯示所有包含某些搜尋詞的段落,但從其行中刪除任何左縮排並限制行長:
清單6.在xml元素文字中搜尋單詞
% find-xml-text events were | sed 's/^ *//' | fmt -w 70
lest we forget some events in a recent decade...
......those in salem and by huac.
it is not particularly remarkable...
......being uncovered.
翻譯自:命令列xml處理
Go語言 flag Go的命令列引數 命令列處理
1.命令列引數 命令列引數是指定程式執行引數的乙個常見方式。例如,go run hello.go,程式 go 使用了 run 和 hello.go 兩個引數。package main import os import fmt func main 要實驗命令列引數,最好先使用 go build 編譯乙...
命令列 Git Bash命令列小結
展示當前完整路徑pwd 建立資料夾mkdir 建立檔案touch 刪除資料夾rm rf 刪除檔案rm 重新命名mv 展示當前路徑下檔案 除了隱藏檔案 ls 展示當前路徑下所有檔案ls a 展示當前路徑下所有檔案以及詳細資訊ls al 轉至某目錄cd 根目錄 上級目錄.當前目錄.檢視檔案cat 檔名稱...
核心命令列處理
清單5 5是語法乏味的定義。回想 清單5 4,我們最初所呼叫的 setup巨集的形式如下 setup console console setup 經過稍稍簡化,編譯器在巨集擴充套件後,其預處理器產生如下結果 static char setup str console setup initdata c...