Text-Formatting

結構化數據格式到 XML

  • January 16, 2020

我有一些結構化數據格式的輸出,需要將其轉換為 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 解析器可以容忍這一點。)

引用自:https://unix.stackexchange.com/questions/562136