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

如何使用camel-xstream定义自定义命名空间和标签别名

邵兴文
2023-03-14

我正在尝试将管道分隔字符串转换为xml,这很好。但是,我没有得到我在下面展示的实际输出。在我的输出中,父标记与包名一起生成,它也没有生成我想要的名称空间。你能帮我把平面文件转换成我期望的精确输出吗。

CamelConfig。JAVA

@Component
public class CamelConfig extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        try {
            CamelContext context = new DefaultCamelContext();
            ConverterRoute route = new ConverterRoute();
            route.addRoutesToCamelContext(context);
            context.start();
            Thread.sleep(5000);
            context.stop();

        } catch (Exception exe) {
            exe.printStackTrace();
        }
    }
}

ConverterRoute。JAVA

public class ConverterRoute implements RoutesBuilder {

    private static final String SOURCE_INPUT_PATH = "file://inbox?fileName=Source.txt";

    private static final String SOURCE_OUTPUT_PATH = "file://outbox?fileName=file.xml";

    public void addRoutesToCamelContext(CamelContext context) throws Exception {

        context.addRoutes(new RouteBuilder() {
            public void configure() {
                try {
                    DataFormat bindyFixed = new BindyCsvDataFormat(Test.class);

                    from(SOURCE_INPUT_PATH).
                            unmarshal(bindyFixed).
                            marshal().
                            xstream().
                            to(SOURCE_OUTPUT_PATH).log("Finished Transformation").end();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

来源txt

55158|11901|2346
55158|11101|3454

Test.java

package com.john;
@CsvRecord(separator = "\\|",skipField = true,name = "Test")
public class Test {

    @DataField(pos = 1,name = "ALT_NUM")
    private BigDecimal ALT_NUM;

    @DataField(pos = 2,name = "PRTNUM")
    private BigDecimal PRTNUM;

    @DataField(pos = 3,name = "UOMCOD")
    private Integer UOMCOD;

}

输出

测验xml

<?xml version='1.0' encoding='UTF-8'?>
    <com.john.Test>
            <ALT_NUM>55158</ALT_NUM>
            <PRTNUM>11901</PRTNUM>
            <UOMCOD>2346</UOMCOD>
    </com.john.Test>

预期产量

测验xml

<?xml version='1.0' encoding='UTF-8'?>
    <Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <ALT_NUM>55158</ALT_NUM>
            <PRTNUM>11901</PRTNUM>
            <UOMCOD>2346</UOMCOD>
    </Test>

共有1个答案

侯博易
2023-03-14

您可以使用别名数据格式属性定义类型别名:

XStreamDataFormat xstream = new XStreamDataFormat();
xstream.setAliases(Collections.singletonMap("Test", Test.class.getCanonicalName()));
//...
.marshal(xstream)

为了定义自定义命名空间,请在您的实体中使用@XStreamAsAttie@XStreamAlias

public class Test {
    @XStreamAsAttribute
    @XStreamAlias("xmlns:xsi")
    private final String xmlns = "http://www.w3.org/2001/XMLSchema-instance";
    //...
}
 类似资料:
  • 我正在尝试使用camel Bindy将管道分隔的字符串数据转换为xml。但它正在生成标记和类名。此外,我想添加命名空间到我的标记。 我试图使用Camel进程来生成自定义标记,但它不起作用。 输出result.xml 上面发布的是给定转换的输出。在第一个标记中,它打印带有整个包和类名的标记名(例如:com.abc.domain.pojo)。另外,我试图生成命名空间,但在输出中没有生成命名空间。

  • 本文向大家介绍thinkphp autoload 命名空间自定义 namespace,包括了thinkphp autoload 命名空间自定义 namespace的使用技巧和注意事项,需要的朋友参考一下 使用thinkPHP过程中,一些自定义的类库和第三方类库需要找一个合适的位置放置,放到系统默认的org文件夹感觉不太好,破坏了thinkPHP的原生目录。 就看了一下官方手册,可以在模块或者应用的

  • 我正在为包含单个类的现有JAR创建一个Xamarin Android绑定库,并且按照Xamarin绑定库文档,我能够成功地使用以下方法重命名命名空间: 我还确认了'obj/debug'文件夹中生成的类中的命名空间发生了更改: 我面临两个问题: > 我无法从示例Android项目中引用。就像根本看不到命名空间一样。绑定项目成功生成,没有出错。 如果我删除包命名空间重命名设置,它也会成功生成,然后我就

  • 问题内容: 在我的html中,我很好奇使用唯一标识符(例如 保存图片)而不是语义是否正确。例如: 是否优先拥有: 与CSS: 而不是:我目前有: 与CSS: 唯一标识符的使用在语义上是否正确? 问题答案: 最好避免使用自定义标签,因为您永远不知道这些标签何时会标准化,并在将来有特殊用途。 如果要避免使用标头标记,对于您的示例最好的操作如下: 此外: 如果在设计页面时不使用标准html标记,则在禁用

  • 按照在symfony2中加载应用程序的自定义配置文件时发布的建议,我陷入了名称空间问题。 在中,我有两个文件: 上诉。php: 和Configuration.php: 似乎我犯了某种错误,将文件命名为正在执行: 结果: PHP致命错误:在/var/www/dev.investmentopportunities中找不到类“AppBundle\DependencyInjection\Configura

  • 我在xslt中需要这个,但是xmlns:s=“{$service-uri}”没有提取: 如何提取名称空间定义中的service-uri变量?扎梅克