結構化數據格式到 XML
我有一些結構化數據格式的輸出,需要將其轉換為 XML。
我的案例是 Palo Alto 防火牆通過命令行界面提供配置輸出,不能用於恢復配置。它需要轉換成 XML 才能使用。
格式是(只是一個巨大文件的片段來得到這個想法):
unknown-applications { unknown-tcp { destinations-per-hour 10; sessions-per-hour 10; session-length { maximum-bytes 100; minimum-bytes 50; } } unknown-udp { destinations-per-hour 10; sessions-per-hour 10; session-length { maximum-bytes 100; minimum-bytes 50; } } }
並且需要
<unknown-applications> <unknown-tcp> <destinations-per-hour>10</destinations-per-hour> <sessions-per-hour>10</sessions-per-hour> <session-length> <maximum-bytes>100</maximum-bytes> <minimum-bytes>50</minimum-bytes> </session-length> </unknown-tcp> <unknown-udp> <destinations-per-hour>10</destinations-per-hour> <sessions-per-hour>10</sessions-per-hour> <session-length> <maximum-bytes>100</maximum-bytes> <minimum-bytes>50</minimum-bytes> </session-length> </unknown-udp> </unknown-applications>
有沒有類似解析器的東西來實現這一點?
編輯:因為評論不允許我發表這麼多:謝謝,看起來很有希望!
有些部分沒有正確轉換,因為我沒有列出它的例子:例如
import { network { interface [ ethernet1/5 ethernet1/6]; } }
轉換為
<import> <network> <interface>[</interface> </network> </import>
但應該是
<import> <network> <interface> <member>ethernet1/5</member> <member>ethernet1/6</member> </interface> </network> </import>
我看到有一些具體的事情,比如
$$ $$使其成為成員,所以我不確定手動執行它有多可行……原始格式也應該是 xml
由於您的輸入格式是非標準的,因此您需要編寫一個解析器來處理它。有兩種方法:您可以用任何過程程式語言“手動”編寫它(通常作為由上而下遞歸下降解析器),或者您可以使用某種解析器生成器。在後一種方法中,您定義輸入語法的 BNF,並且該工具為您建構解析器。如果您可以使用 Scala,那麼這將非常容易。
另一個在 XML 世界中經常使用的解析器生成器是 REx——它很方便,因為它將在 XQuery 或 XSLT 中生成解析器,這使得 XML 生成方面的問題變得非常容易;這是一款很棒的軟體,但遺憾的是它的文件記錄很差。另一個面向 XML 的工具是 Stephen Pemberton 的“Invisible XML”(https://homepages.cwi.nl/~steven/ixml/)——如果 REx 是一個很棒的軟體,但文件很差,那麼 Invisible XML 是一個很棒的文件發布的軟體不多。
我想到了另一種廉價而愉快的方法:使用基於正則表達式的相當簡單的編輯器腳本,您可以:
- 將名稱放在引號中並添加終止冒號
- 用逗號替換分號
然後你會得到許多 JSON 解析器會接受的東西(它不太符合,因為你的分號是終止符而不是分隔符,但是許多 JSON 解析器可以容忍這一點。)