当前位置: 首页 > 知识库问答 >
问题:

apache camel split()vs split(body())

曾骁
2023-03-14
from(direct:start)
.split().tokenizeXML("SomeElement", 25)
... 
SaxParseException: Cannot find the declaration of element 'SomeElement'
.split(body().tokenizeXML("SomeElement", "*"))

是的,这是有效的,但是split将表达式作为参数,而使用表达式body().tokenizexml(“someelement”,“*”)则没有机会使用分组特性。所以我的问题是,1。为什么split()找不到元素?2.是否有机会在split(Expression)中使用组特性?

由于我们绑定到Java6,所以我们使用camel Version2.13.4。

XML文件如下所示(简化后,假设MyRootElement中有数百个SomeElement元素)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MyRootElement xmlns="urn:THIS:IS:A-NAMESPACE">
    <SomeElement id="12345">
        <address addressType="mainAddress" street="Test street" zipCode="12345" city="Testcity"/>
    </SomeElement>
    <SomeElement id="23456">
        <address addressType="mainAddress" street="Test street" zipCode="12345" city="Testcity"/>
    </SomeElement>
</MyRootElement>
<MyRootElement xmlns="urn:THIS:IS:A-NAMESPACE" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="urn:THIS:IS:A-NAMESPACE">
        <SomeElement id="12345">
            <address addressType="mainAddress" street="Test street" zipCode="12345" city="Testcity"/>
        </SomeElement>
</MyRootElement>

split().tokenizexml(“someelement”,2)不考虑根元素和命名空间,因此得到如下内容:

    <SomeElement id="12345">
                <address addressType="mainAddress" street="Test street" zipCode="12345" city="Testcity"/>
    </SomeElement>
    <SomeElement id="23456">
                <address addressType="mainAddress" street="Test street" zipCode="12345" city="Testcity"/>
    </SomeElement>

当然,如果我根据模式验证拆分的消息,它就会失败。因为我需要将someelements嵌入根元素myrootelement中,如下所示:

<MyRootElement xmlns="urn:THIS:IS:A-NAMESPACE" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="urn:THIS:IS:A-NAMESPACE">
  <SomeElement id="12345">
            <address addressType="mainAddress" street="Test street" zipCode="12345" city="Testcity"/>
  </SomeElement>
  <SomeElement id="23456">
            <address addressType="mainAddress" street="Test street" zipCode="12345" city="Testcity"/>
  </SomeElement>
</MyRootElement>

共有1个答案

葛胜泫
2023-03-14

我通过了这个分组和xml拆分测试:

public class TestSplitOnXml extends CamelTestSupport {

    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("direct:in")
                    .split().tokenizeXML("SomeElement", 2)
                        .to("mock:out")
                        .end();
            }
        };
    }

    @Test
    public void testSplitting() throws InterruptedException {
        MockEndpoint mockEndpoint = getMockEndpoint("mock:out");
        mockEndpoint.setExpectedMessageCount(2);

        Exchange exchange = createExchangeWithBody(this.getClass().getClassLoader().getResourceAsStream("text.xml"));
        template.send("direct:in", exchange);

        assertMockEndpointsSatisfied();
    }
}

将其作为test.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MyRootElement xmlns="urn:THIS:IS:A-NAMESPACE" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="urn:THIS:IS:A-NAMESPACE">
    <SomeElement id="12345">
        <address addressType="mainAddress" street="Test street" zipCode="12345" city="Testcity"/>
    </SomeElement>
    <SomeElement id="23456">
        <address addressType="mainAddress" street="Test street" zipCode="12345" city="Testcity"/>
    </SomeElement>
    <SomeElement id="23456">
        <address addressType="mainAddress" street="Test street" zipCode="12345" city="Testcity"/>
    </SomeElement>
    <SomeElement id="23456">
        <address addressType="mainAddress" street="Test street" zipCode="12345" city="Testcity"/>
    </SomeElement>
</MyRootElement>

从中可以看出,拆分、tokeniseXML和分组确实有效。可能是xml缺少xmlns:xsi=“http://www.w3.org/2001/xmlschema-instance”xsi:schemalocation=“urn:this:is:a-namespace”

 类似资料:
  • 问题内容: 背景 我正在使用Spring MVC创建RESTful服务。当前,我具有以下控制器结构: 如您所见,这三种方法都为标头接收相同的参数,并以相同的方式将其应用于每种方法:。我将创建类似的控制器,并且对于POST,PUT和PATCH操作将包含几乎相同的代码,但适用于其他实体。当前,大多数实体旨在通过超类来支持该领域: 另外,我使用拦截器来验证是否已为请求设置标头。 题 如何避免通过控制器类

  • 问题内容: 我正在尝试使用Webflux将生成的文件流式传输到另一个位置,但是,如果文件的生成遇到错误,则api返回成功,但是DTO在生成文件而不是文件本身时会详细说明错误。这使用的是非常古老且设计不佳的api,因此请原谅post和api设计的使用。 api调用(exchange())的响应是ClientResponse。从这里,我可以使用bodyToMono转换为ByteArrayResourc

  • 问题内容: 背景 我正在使用Spring MVC创建一系列RESTful服务。当前,我具有以下控制器结构: 可以看出,这三种方法对于标头是相同的参数,并且在每种方法中都采用相同的方式:。我将创建类似的控制器,对于POST,PUT和PATCH操作,它们将包含类似的代码,但面向其他实体。当前,大多数实体旨在通过父类支持此字段: 注意,我使用拦截器来验证是否已根据请求设置标头。 题 如何避免在控制器和方

  • 问题内容: 我正在开发我的第一个Android应用程序。我正在尝试做的是对REST服务的POST请求,我希望此请求的主体为JSON字符串。 我正在使用Google的GSON来生成发送到服务器的JSON。这是执行POST请求的代码: 响应代码为400 BAD REQUEST,我可以从服务器日志中读取信息。尸体未正确发送的地方: 服务器端的代码是一个简单的Seam Rest Service: Andr

  • 问题内容: 鉴于此html: 我要填充其容器块的所有剩余垂直空间,我从这里开始: 100%的高度也是如此,这意味着它正在采用其父容器块的高度,即问题是似乎没有起作用,未被裁剪。 另一方面,如果我换行并使用另一个具有与上述相同属性的div,则将得到所需的结果: 与此HTML当然: 我的问题是为什么并且似乎具有相同属性的不同行为?没有包装,有没有办法获得相同的效果? 具有相同属性的两个jsFiddle

  • 问题内容: 我看不出两者之间的区别: 和 有什么解释吗? 问题答案: 两者之间没有真正的区别(如果您只是在谈论在哪里申请,那么BoltClock对另一个问题的答案更合适)。是一个元素,就像是。 两者都是有效的选择,并且都可以在所有通用浏览器中使用。 例如,YUI重置选择在元素上设置一个,而不是: 这要求您将on 设置为on ,例如,请参见:无法使用CSSreset更改主体背景颜色 根元素的背景成为

  • 问题内容: 我知道这个问题被问过很多次,但是我没有找到答案。那么,为什么建议在body标签的末尾添加脚本以更好地渲染呢? 从Udacity课程和CSSOM准备就绪后开始渲染。JS是HTML解析阻止程序,并且CSSOM准备好后,任何脚本都会启动。 因此,如果我们得到: CRP为: 如果脚本在头: CRP将相同: 这个问题仅与“同步”脚本有关(没有async / defer属性)。 问题答案: 从历史

  • 本文向大家介绍style标签写在body前和body后的区别是什么?相关面试题,主要包含被问及style标签写在body前和body后的区别是什么?时的应答技巧和注意事项,需要的朋友参考一下 渲染机制的区别,在body前是已经把样式浏览一遍,到了对应标签直接,渲染样式。显示块。 在body后,是浏览器已经把标签浏览了,但基于没有样式,显示的不完全,再把body后的样式表,扫描后,在成为真正的样式。