【问题标题】:Is it possible to make the Tokenizer namespace aware (when using Splitter)是否可以让 Tokenizer 命名空间感知(使用 Splitter 时)
【发布时间】:2012-09-11 07:12:18
【问题描述】:

我们有一个应用程序正在处理非常大的 xml 文件 (3GB+)。对于拆分,我们使用 Tokenizer。我们收到的 xml 有不同的命名空间前缀或根本不使用前缀。 Tokenizer 可以处理这个吗? 我发现的唯一一件事是使用 inheritNamespaceTagName 属性继承默认命名空间,但不幸的是,当使用命名空间前缀时它不起作用。

感谢您的帮助!

样本 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>

【问题讨论】:

  • 您应该查看扩展的 vtd-xml 并使用它来拆分最大 256 GB 的 XML 文档。

标签: xml apache-camel xml-namespaces


【解决方案1】:

请参阅选项 inheritNamespaceTagName,记录在:http://camel.apache.org/splitter.html。所以在你的情况下应该是:

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

试试看。

您可以找到几篇关于如何使用 Camel 拆分大型 XML 文件的博客文章的链接。链接在此页面:http://camel.apache.org/articles。第二个是关于 camel-stax,这是一种使用 JAXB 注释的 pojo 对数据进行建模的不同方法。

我们还在开发一个camel-vtdxml 组件。它还可以使用 vtd-xml 库拆分大型 XML 文件。详情见:http://camel.apache.org/vtd-xml

【讨论】:

  • 嗨克劳斯。感谢您的帮助,但 inheritNamespaceTagName 对命名空间前缀没有任何作用。它只是从父标签复制命名空间定义。您可以在源代码中看到这一点:org.apache.camel.builder.ExpressionBuilder#tokenizeXMLExpression JAXB 性能不够。在我们的应用程序中,我们需要在几分钟内处理 1000 万个订单。我创建了一个示例类:pastebin.com/h2GLVsHb 当您将“order”和“orders”更改为“foo:order”/“foo:orders”时它可以工作,但我认为它应该在没有命名空间前缀的情况下工作。
猜你喜欢
  • 2013-06-10
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
相关资源
最近更新 更多