Parsing Mule flow:如何从XML文件中删除BOM标记

Parsing Mule flow:如何从XML文件中删除BOM标记,parsing,mule,sax,byte-order-mark,Parsing,Mule,Sax,Byte Order Mark,我为Mule流输入了复杂的大XML文件 文件端点->字节数组到字符串->拆分器->… 我得到了org.xml.sax.SAXParseException:当我尝试使用拆分器组件处理输入文件时,prolog中不允许有内容。当我创建新的xml文件并将原始文件的内容复制到该文件时,将处理输入文件。 创建新文件时删除BOM表标记。原始文件从文件开始就有EF BB BF,本地文件没有 Mule配置: <?xml version="1.0" encoding="UTF-8"?> <mule

我为Mule流输入了复杂的大XML文件

文件端点->字节数组到字符串->拆分器->…

我得到了org.xml.sax.SAXParseException:当我尝试使用拆分器组件处理输入文件时,prolog中不允许有内容。当我创建新的xml文件并将原始文件的内容复制到该文件时,将处理输入文件。 创建新文件时删除BOM表标记。原始文件从文件开始就有EF BB BF,本地文件没有

Mule配置:

<?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.使用文件转换字符串,而不是使用bytearray转换字符串


2.检查大xml是否已完全读取,如果未使用文件端点的文件期限属性,则可以完全读取大文件

U可以在拆分Java transformer之前添加类:

package importxmltoapis;
导入org.mule.api.MuleMessage;
导入org.mule.api.transformer.TransformerException;
导入org.mule.transformer.AbstractMessageTransformer;
公共类DeleteBOM扩展了AbstractMessageTransformer{
公共静态最终字符串BOM=“\uFEFF”;
@凌驾
公共对象转换消息(多消息消息、字符串输出编码)
抛出TransformerException{
字符串s=“”;
尝试{s=removeBOM(message.getPayloadAsString());}catch(异常e){e.printStackTrace();}
返回s;
}
私有静态字符串移除BOM(字符串s){
如果(s.startsWith(BOM)){
s=s。子串(1);
}
返回s;
}

}
这是一篇很老的帖子,但这里是我的贡献

除了推荐的Java transformer方法之外,我强烈建议您使用ApacheCommons'
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");
    }
}

}
我使用以下配置部分复制了您的Mule应用程序:

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

...

如需进一步参考,请转至

添加您的配置以更好地理解。已添加Mule配置