2012-09-11 99 views
1

我們有一個應用程序,用於處理非常大的xml文件(3GB +)。爲了分割,我們使用Tokenizer。我們收到的XML具有不同的名稱空間前綴或根本不使用前綴。 Tokenizer可以處理這個問題嗎? 我唯一發現的是繼承了inheritNamespaceTagName屬性的默認命名空間,但不幸的是,當使用命名空間前綴時,它不起作用。是否有可能使Tokenizer名稱空間可識別(使用分離器時)

感謝您的幫助!

示例1:

<foo:orders xmnls:foo="http://foo.com"> 
    <foo:order id="1">Camel in Action</order> 
    <foo:order id="1">ActiveMQ in Action</order> 
    <foo:order id="1">DSL in Action</order> 
</foo:orders> 

示例2:

<bar:orders xmnls:foo="http://foo.com"> 
    <bar:order id="1">Camel in Action</order> 
    <bar:order id="1">ActiveMQ in Action</order> 
    <bar:order id="1">DSL in Action</order> 
</bar:orders> 

我們的路線:

<route id="orderProcessorRoute"> 
     <from uri="file:process-xml?delete=true"/> 
     <split streaming="true"> 
      <tokenize token="order" xml="true"/> 
      <to uri="bean:xmlParseBean"/> 
      <to uri="vm:orderAggregator"/> 
     </split> 
    <to uri="file:backup"/> 
</route> 
+1

您應該查看擴展vtd-xml並使用它來將XML文檔分割爲最大256 GB的大小。 –

回答

1

看到選項inheritNamespaceTagName,在記載:http://camel.apache.org/splitter.html。所以你的情況應該是:

<tokenize token="order" inheritNamespaceTagName="orders" xml="true"/> 

給一個嘗試。

你可以找到幾篇博客文章的鏈接,告訴你如何將大的XML文件與Camel分離。鏈接在此頁面:http://camel.apache.org/articles。第二個是關於camel-stax,這是使用JAXB帶註釋的pojo對數據建模的另一種方法。我們正在研究camel-vtdxml組件。它還可以使用vtd-xml庫拆分大型XML文件。詳情請參閱:http://camel.apache.org/vtd-xml

+0

嗨,克勞斯。感謝您的幫助,但inheritNamespaceTagName不會對命名空間前綴做任何事情。它只是從父標籤複製名稱空間定義。您可以在源代碼中看到以下內容:org.apache.camel.builder.ExpressionBuilder#tokenizeXMLExpression JAXB性能不足。在我們的應用程序中,我們需要在幾分鐘內處理1000萬個訂單。 我創建了一個樣本類:http://pastebin.com/h2GLVsHb 當您將「訂單」和「訂單」更改爲「foo:order」/「foo:orders」時,它可以工作,但我認爲它應該沒有問題命名空間前綴。 – jvwilge

相關問題