2013-11-27 2 views
0

Mule 흐름을 위해 복잡한 XML 파일을 입력했습니다.Mule flow : XML 파일에서 BOM 마커 제거 방법

파일의 최종 점 -> 문자열을 바이트 배열 -> 분배기 -> ... 내가 가지고

org.xml.sax.SAXParseException : 내용은 프롤로그에서 허용되지 않습니다 때 스플리터 구성 요소를 사용하여 입력 파일을 처리하려고합니다. 새 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

당신이 더 나은 이해를 위해 config (설정) 추가로 이동합니다. – user1760178

+0

뮬 구성이 추가되었습니다. – user3042795

답변

-1

문자열 변압기에 문자열 변압기 대신이 ByteArray에 파일 1. 한

다음보십시오.

2. 큰 xml을 완전히 읽었는지 확인하고 파일 끝점의 파일 보존 속성을 사용하지 않으면 큰 파일을 완전히 읽을 수 있습니다.

0

U 클래스로 분할하기 전에 자바 변압기를 추가 할 수 있습니다

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에 의해 제안 된 자바 변압기 접근 방식에, 나는 강하게 당신이 아웃 - 오브 - 박스 아파치 코 몬즈 '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

관련 문제