【问题标题】:Mule flow: How remove BOM marker from XML fileMule flow:如何从 XML 文件中删除 BOM 标记
【发布时间】:2013-11-27 17:29:21
【问题描述】:

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

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

当我尝试使用 Splitter 组件处理输入文件时,我得到 org.xml.sax.SAXParseException: Content is not allowed in prolog。当我创建新的 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>

请告诉我如何在 Mule 流程中做到这一点。提前谢谢你。

【问题讨论】:

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

标签: parsing mule sax byte-order-mark


【解决方案1】:

你可以在拆分前添加一个带有类的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)
		throws TransformerException {

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

	return s;
	}

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

【讨论】:

    【解决方案2】:

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

    除了@alexander-shapkin 建议的Java 转换器方法之外,我强烈建议您使用Apache Commons 的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>
    

    如需进一步参考,请转至https://commons.apache.org/proper/commons-io/javadocs/api-2.2/org/apache/commons/io/input/BOMInputStream.html

    【讨论】:

      【解决方案3】:

      试试下面的

      1.使用文件串转换器而不是字节数组串转换器。

      2.检查你的大xml是否被完全读取,如果没有使用文件端点的文件年龄属性,这将使你能够完全读取你的大文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-26
        • 2012-04-01
        • 1970-01-01
        • 2010-09-22
        • 1970-01-01
        • 1970-01-01
        • 2017-12-27
        • 2014-02-07
        相关资源
        最近更新 更多