2017-02-14 69 views
0

我試圖一般性地編寫XML解析器來消費未知模式的提要。基本上,我想對「行」在XML文檔中的位置做出最佳猜測。這裏有兩個例子提要:自動檢測/解析XML中的重複元素('行對象')

飼料1,例如:

<xml> 
    <some-container-tag> 
    <some-row-tag> 
     <attribute-1>value</attribute-1> 
     <attribute-2>value</attribute-2> 
     <attribute-3>value</attribute-3> 
     <attribute-4>value</attribute-4> 
    </some-row-tag> 
    <some-row-tag> 
     <attribute-1>value</attribute-1> 
     <attribute-2>value</attribute-2> 
     <attribute-3>value</attribute-3> 
     <attribute-4>value</attribute-4> 
    </some-row-tag> 
    ... 
    </some-container-tag> 
</xml> 

飼料2,例如:

<xml> 
    <some-container-tag> 
    <some-row-tag> 
     <attribute-1>value</attribute-1> 
     <attribute-2>value</attribute-2> 
     <attribute-3>value</attribute-3> 
     <attribute-4>value</attribute-4> 
     <optional-nested-attribute-set> 
     ... 
     </optional-nested-attribute-set> 
    </some-row-tag> 
    <some-row-tag> 
     <attribute-1>value</attribute-1> 
     <attribute-2>value</attribute-2> 
     <attribute-3>value</attribute-3> 
     <attribute-4>value</attribute-4> 
     <optional-nested-attribute-set> 
     ... 
     </optional-nested-attribute-set> 
    </some-row-tag> 
    ... 
    </some-container-tag> 
    <some-other-container-tag> 
    <some-row-tag> 
     <attribute-1>value</attribute-1> 
     <attribute-2>value</attribute-2> 
     <attribute-3>value</attribute-3> 
     <attribute-4>value</attribute-4> 
     <optional-nested-attribute-set> 
     ... 
     </optional-nested-attribute-set> 
    </some-row-tag> 
    </some-other-container-tag> 
</xml> 

我所做的到目前爲止是橫貫結構和地圖的XPath來一個計數,例如第一進是這樣的:

xml => 1 
xml/some-container-tag => 1 
xml/some-container-tag/some-row-tag => n 
xml/some-container-tag/some-row-tag/attribute-1 => n 
xml/some-container-tag/some-row-tag/attribute-2 => n 
xml/some-container-tag/some-row-tag/attribute-3 => n 
xml/some-container-tag/some-row-tag/attribute-4 => n 

現在我的想法是,「基本單位」(行級)將是最低級的非葉節點,雖然我有問題(獨奏開發在這裏)審查這個想法。

當然,feed 2的'更'更復雜,可能有嵌套的屬性(基本上是子數組),也可能有兩個父列表。

這裏有什麼足夠好的通用方法?

回答

0

你的問題是你試圖將多維樹結構轉換爲二維表格結構。沒有一個模式,你沒有一個好方法來確保你的假設是正確的,但是如果你必須這樣做,你必須提出一些假設。

您可以通過深入的層次,而不是節點的數量在一個特定的深度接近它(還有什麼可說的,所有的葉節點將在相同的深度,你正在運行到現在的問題):

  1. 深度0(根標記)指示的數據結構的一個新的集合
  2. 深度1(some-container-tag)指示新的二維結構
  3. 深度2(some-row-tag)表示在兩維結構的新行
  4. 深度3+表示進入該行的行,其本身可能具有子條目。也許這些被表示爲CSV字符串,或者作爲指向另一個數組/表格的數據結構的指針 - 但是如果你開始添加,那麼你不再真正處理二維結構。

所有這些都取決於您最終需要處理的數據以及您選擇處理它的語言的哪些假設是有效的。無論哪種方式,您都可能最好通過深度而不是計數來解析這一點。另外,如果這確實是無模式的,那麼您可能需要考慮如何處理XML中顯示的屬性。