2013-11-27 46 views
0

我输入了Mule流的复杂大XML文件。Mule流:如何从XML文件中删除BOM标记

文件结束点 - >字节数组字符串 - >分离器 - > ....

我有org.xml.sax.SAXParseException:内容是不允许在序言时我尝试通过使用Splitter组件来处理输入文件。当我创建新的xml文件并将原始文件的内容复制到文件时,会处理输入文件。 我在创建新文件时删除BOM标记。自文件开始以来,原始文件具有EF BB BF,本地文件没有。

骡配置:

<?xml version="1.0" encoding="UTF-8"?> 
<mule xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking"  
xmlns:mulexml="http://www.mulesoft.org/schema/mule/xml" 
xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" 
xmlns:spring="http://www.springframework.org/schema/beans" version="EE-3.4.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.mulesoft.org/schema/mule/file  
http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans 
current.xsd 
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd 
http://www.mulesoft.org/schema/mule/xml http://www.mulesoft.org/schema/mule/xml/current/mule-xml.xsd 
http://www.mulesoft.org/schema/mule/ee/tracking  
http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd"> 

<mulexml:dom-to-xml-transformer name="domToXml"/> 

<flow name="SplitterFlow1" doc:name="SplitterFlow1"> 
<file:inbound-endpoint path="D:\WORK\Input" 
moveToDirectory="D:\WORK\Output" 
responseTimeout="10000" doc:name="File" fileAge="200" encoding="UTF-8"/> 
<byte-array-to-string-transformer doc:name="Byte Array to String" /> 
<splitter evaluator="xpath" expression="/Invoices/invoice" 
doc:name="Splitter"/> 
<transformer ref="domToXml" doc:name="Transformer Reference"/> 
    <tracking:custom-event event-name="Invoice ID" doc:name="Custom Business event"> 
    </tracking:custom-event> 
<logger level="INFO" doc:name="Logger"/> 
<file:outbound-endpoint path="D:\WORK\Output" 
outputPattern="#[function:dateStamp:dd-MM-yyyy-HH.mm.ss]-#[header:OUTBOUND:MULE_CORRELATION_SEQUENCE]" 
responseTimeout="10000" doc:name="File"></file:outbound-endpoint> 
</flow> 
</mule> 

请告诉我,我怎么能在骡子流程去做。先谢谢你。

+1

添加您配置了更好的理解。 – user1760178

+0

添加了Mule配置 – user3042795

回答

-1

请尝试以下

1.使用文件串变压器,而不是字节组串变压器。

2.检查您是否完全读取了大XML文件,是否使用文件端点的文件时间属性,这将使您能够完全读取大文件。

0

U可以带班分流器前加一个Java的变压器:

package importxmltoapis; 
 
import org.mule.api.MuleMessage; 
 
import org.mule.api.transformer.TransformerException; 
 
import org.mule.transformer.AbstractMessageTransformer; 
 

 
public class DeleteBOM extends AbstractMessageTransformer{ 
 
public static final String BOM = "\uFEFF"; 
 

 
@Override 
 
public Object transformMessage(MuleMessage message, String outputEncoding) 
 
\t \t throws TransformerException { 
 

 
\t String s=""; 
 
\t try {s = removeBOM(message.getPayloadAsString());} catch (Exception e) {e.printStackTrace();} 
 

 
\t return s; 
 
\t } 
 

 
\t private static String removeBOM(String s) { 
 
\t  if (s.startsWith(BOM)) { 
 
\t   s = s.substring(1); 
 
\t  } 
 
\t  return s; 
 
\t } 
 
}

0

这是一个很老的文章,但这里是我的贡献。

Additionaly由@alexander-shapkin提出了Java变压器的办法,我强烈建议您使用阿帕奇百科全书org.apache.commons.io.BOMInputStream处理BOM标记出的即装即用。该代码将类似于下面:

import java.io.InputStream; 

import org.apache.commons.io.ByteOrderMark; 
import org.apache.commons.io.IOUtils; 
import org.apache.commons.io.input.BOMInputStream; 
import org.mule.api.MuleMessage; 
import org.mule.api.transformer.TransformerException; 
import org.mule.transformer.AbstractMessageTransformer; 

public class DeleteBOM extends AbstractMessageTransformer { 

@Override 
public Object transformMessage(MuleMessage message, String outputEncoding) 
     throws TransformerException { 

    try (InputStream in = new BOMInputStream(IOUtils.toInputStream(message.getPayloadAsString()), ByteOrderMark.UTF_8)) {  
     return IOUtils.toString(in); 
    } catch (Exception e) { 
     throw new RuntimeException("Could not remove BOM marker"); 
    } 
} 

} 

我部分地具有以下配置复制你的骡应用:

<file:connector name="File" autoDelete="false" streaming="true" validateConnections="true" doc:name="File" /> 
    <mulexml:dom-to-xml-transformer name="DOM_to_XML" doc:name="DOM to XML"/> 
    <flow name="lalaFlow"> 
     <file:inbound-endpoint path="D:\WORK\Input" moveToDirectory="D:\WORK\Output" responseTimeout="10000" doc:name="File" fileAge="200" encoding="UTF-8"/> 
     <component class="org.mule.bom.DeleteBOM" doc:name="Java"/> 
     <transformer ref="DOM_to_XML" doc:name="Transformer Reference"/> 
     ... 
    </flow> 

更多参考,请https://commons.apache.org/proper/commons-io/javadocs/api-2.2/org/apache/commons/io/input/BOMInputStream.html