首页 > 解决方案 > 如何处理 xml 标签中的下划线

问题描述

如何处理 xml 标签中的下划线。这是我正在工作的代码。它正在为我生成带有双下划线(“__”)而不是单下划线(“_”)的 xml 标记。谁能帮我克服这个问题。

转换器路由.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_$simple{date:now:yyyyMMddHHmmssSSS}.xml";

    public void addRoutesToCamelContext(CamelContext context) throws Exception {

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

                    XStreamDataFormat xStreamDataFormat = new XStreamDataFormat();
                    xStreamDataFormat.setAliases(Collections.singletonMap("TEST_INB",Test.class.getCanonicalName()));

                    from(SOURCE_INPUT_PATH).
                            split().tokenize(System.lineSeparator()).
                            unmarshal(bindyFixed).
                            marshal(xStreamDataFormat).
                            to(SOURCE_OUTPUT_PATH).log("Finished Transformation").end();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

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();
        }
    }
}

测试.java

@CsvRecord(separator = "\\|",skipField = true,name = "TEST_INB")
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;

}

来源.txt

55158|11901|2346
55158|11101|3454

输出

文件.xml

<?xml version='1.0' encoding='UTF-8'?>    
    <TEST__INB>
            <ALT__NUM>55158</ALT__NUM>
            <PRTNUM>11901</PRTNUM>
            <UOMCOD>2346</UOMCOD>
    </TEST__INB>

预期输出

文件.xml

<?xml version='1.0' encoding='UTF-8'?>    
    <TEST_INB>
            <ALT_NUM>55158</ALT_NUM>
            <PRTNUM>11901</PRTNUM>
            <UOMCOD>2346</UOMCOD>
    </TEST_INB>

标签: javaxmlapache-camelbindy

解决方案


XStream 在生成 XML 时在内部使用下划线来转义字符。

请参阅常见问题解答:http: //x-stream.github.io/faq.html#XML_double_underscores

您可以尝试使用自定义驱动程序(而不是默认驱动程序):

XmlFriendlyNameCoder nameCoder = new XmlFriendlyNameCoder("_-", "_");  
Dom4JDriver myCustomDriver = new Dom4JDriver(nameCoder);
... 
XStreamDataFormat xStreamDataFormat = new XStreamDataFormat();
xStreamDataFormat.setDriver(myCustomDriver);

或者,如果不工作,也许尝试使用这个其他替代驱动程序:

DomDriver myCustomDriver = new DomDriver("UTF_8", new NoNameCoder());

希望这有效!


推荐阅读