2016-09-28 44 views
0

我使用Data Weave來轉換XML,並且存在不存在節點的問題。例如XMLMulesoft:不存在深層節點的默認值

<a> 
    <b> 
     <c> 
     value 
     </c> 
    </b> 
</a> 

提取{之一:$ .A,二:$ A·B,三:$ A.B.C}它正常工作時的所有節點,b和c存在。

什麼樣的方式來確定何時節點b是空的,並有節點c的默認值?

這實在是一個簡單的例子。真實數據有很深的層次,每個層次都可以是空的。也許我應該使用when/otherwise,但是接下來我應該爲每個變量重複整個數據結構。

enter image description here

這裏是騾子流量:

<?xml version="1.0" encoding="UTF-8"?> 

<mule xmlns:file="http://www.mulesoft.org/schema/mule/file" xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw" xmlns:metadata="http://www.mulesoft.org/schema/mule/metadata" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" 
    xmlns:spring="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="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/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd 
http://www.mulesoft.org/schema/mule/ee/dw http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd"> 
    <flow name="xml2flatFlow" doc:description="To run copy src/main/resources/*.xml files to src/test/resources/FileIn 
Good working example is xml_in_good.xml 

Issues: 

1) Should be working with Streams but from Json2Flat there is no way to FileOut. &quot;Load everything to memory&quot; is required but it kills stream. What is the way to make it Stream and work with huge files? 

2) FlatFile field have particular length. Transformation should cut the length. Instead it produces exception. Should be option oe way to force the length of the string. 
Example: xml_in_bad_too_long.xml 

3) Main issue - I cannot figure out how process empty nodes. 
Example: xml_in_bad.xml 

Provided example is simlpiest. In reality I have very long xpath like payload.a.b.c.d.e.f.g.h 
I tried to do when/otherwise, default, h?, internal Java program - nothing works. 

I believe that processor File2Json is not necessary but I'd added it to make sure XML processor have no influence on the flow. "> 
     <file:inbound-endpoint path="src\test\resources\FileIn" moveToDirectory="src\test\resources\FileProcessed" responseTimeout="10000" doc:name="FileIn"/> 
     <dw:transform-message metadata:id="24cbc998-ba7d-44f7-a3fa-cb502d352e87" doc:name="File2Json"> 
      <dw:input-payload mimeType="application/xml"/> 
      <dw:set-payload><![CDATA[%dw 1.0 
%output application/json 
--- 
payload]]></dw:set-payload> 
     </dw:transform-message> 
     <logger message="#[payload]" level="INFO" doc:name="Logger"/> 
     <dw:transform-message metadata:id="15c2b229-fb5a-4430-be89-c446e79bfa2e" doc:name="Json2Json"> 
      <dw:input-payload doc:sample="C:\Users\Alex\AnypointStudio6\workspace\xml2flat\src\main\resources\too_long.json" mimeType="application/json"/> 
      <dw:set-payload><![CDATA[%dw 1.0 
%output application/json 
--- 
{ 
    a: payload.a default {}, 
    b: payload.a.b default {}, 
    c: payload.a.b.c default "" 
}]]></dw:set-payload> 
     </dw:transform-message> 
     <dw:transform-message metadata:id="8ef7c277-ec47-4564-9ece-eac11c27c891" doc:name="Json2Flat"> 
      <dw:input-payload doc:sample="C:\Users\Alex\AnypointStudio6\workspace\xml2flat\src\main\resources\too_long.json"/> 
      <dw:set-payload><![CDATA[%dw 1.0 
%output text/plain schemaPath = "flatfile.ffd" , segmentIdent = "" 
--- 
[{ 
    field_0: payload.c default "---" 
}]]]></dw:set-payload> 
     </dw:transform-message> 
     <object-to-string-transformer doc:name="Load everythin to memory"/> 
     <file:outbound-endpoint path="src/test/resources/FileOut" outputPattern="out.txt" responseTimeout="10000" doc:name="FileOut"/> 
    </flow> 
</mule> 

下面是日誌:

******************************************************************************************************* 
* xml2flatSO         * default      * DEPLOYED   * 
******************************************************************************************************* 

INFO 2016-09-30 13:57:29,271 [[xml2flatSO].connector.file.mule.default.receiver.01] org.mule.transport.file.FileMessageReceiver: Lock obtained on file: C:\Users\Alex\AnypointStudio6\workspace\xml2flatSO\src\test\resources\FileIn\xml_in_good.xml 
INFO 2016-09-30 13:57:37,892 [[xml2flatSO].xml2flatFlow.stage1.02] org.mule.api.processor.LoggerMessageProcessor: { 
    "a": { 
    "b": { 
     "c": "GOOD" 
    } 
    } 
} 
INFO 2016-09-30 13:57:42,334 [[xml2flatSO].connector.file.mule.default.dispatcher.01] org.mule.lifecycle.AbstractLifecycleManager: Initialising: 'connector.file.mule.default.dispatcher.546298364'. Object is: FileMessageDispatcher 
INFO 2016-09-30 13:57:42,334 [[xml2flatSO].connector.file.mule.default.dispatcher.01] org.mule.lifecycle.AbstractLifecycleManager: Starting: 'connector.file.mule.default.dispatcher.546298364'. Object is: FileMessageDispatcher 
INFO 2016-09-30 13:57:42,335 [[xml2flatSO].connector.file.mule.default.dispatcher.01] org.mule.transport.file.FileConnector: Writing file to: C:\Users\Alex\AnypointStudio6\workspace\xml2flatSO\src\test\resources\FileOut\out.txt 
INFO 2016-09-30 13:57:52,448 [[xml2flatSO].connector.file.mule.default.receiver.01] org.mule.transport.file.FileMessageReceiver: Lock obtained on file: C:\Users\Alex\AnypointStudio6\workspace\xml2flatSO\src\test\resources\FileIn\xml_in_bad.xml 
INFO 2016-09-30 13:57:55,979 [[xml2flatSO].xml2flatFlow.stage1.02] org.mule.api.processor.LoggerMessageProcessor: { 
    "a": "" 
} 
ERROR 2016-09-30 13:58:16,403 [[xml2flatSO].xml2flatFlow.stage1.02] org.mule.exception.DefaultMessagingExceptionStrategy: 
******************************************************************************** 
Message    : Exception while executing: 
    b: payload.a.b default {}, 
    ^
Type mismatch for 'Value Selector' operator 
    found :string, :name 
    required :datetime, :name or 
    required :localdatetime, :name or 
    required :object, :name or 
    required :time, :name or 
    required :array, :name or 
    required :date, :name or 
    required :localtime, :name or 
    required :period, :name 
Payload    : { 
    "a": "" 
} 
Payload Type   : java.lang.String 
Element    : /xml2flatFlow/processors/3 @ xml2flatSO:xml2flat.xml:37 (Json2Json) 
Element XML   : <dw:transform-message metadata:id="15c2b229-fb5a-4430-be89-c446e79bfa2e" doc:name="Json2Json"> 
         <dw:input-payload doc:sample="C:\Users\Alex\AnypointStudio6\workspace\xml2flat\src\main\resources\too_long.json" mimeType="application/json"></dw:input-payload> 
         <dw:set-payload>%dw 1.0%output application/json---{a: payload.a default {},b: payload.a.b default {},c: payload.a.b.c default ""}</dw:set-payload> 
         </dw:transform-message> 
-------------------------------------------------------------------------------- 
Root Exception stack trace: 
com.mulesoft.weave.engine.ast.dynamic.UnexpectedOperationTypesException: Type mismatch for 'Value Selector' operator 
    found :string, :name 
    required :datetime, :name or 
    required :localdatetime, :name or 
    required :object, :name or 
    required :time, :name or 
    required :array, :name or 
    required :date, :name or 
    required :localtime, :name or 
    required :period, :name 
    at com.mulesoft.weave.engine.ast.OpNode$class.doExecuteAutoCoercion(OpNode.scala:79) 
    at com.mulesoft.weave.engine.ast.BinaryOpNode.doExecuteAutoCoercion(BinaryOpNode.scala:8) 
    at com.mulesoft.weave.engine.ast.OpNode$class.doExecute(OpNode.scala:33) 
    at com.mulesoft.weave.engine.ast.BinaryOpNode.doExecute(BinaryOpNode.scala:8) 
    at com.mulesoft.weave.engine.ast.ValueNode$class.execute(AstNode.scala:38) 
    at com.mulesoft.weave.engine.ast.BinaryOpNode.execute(BinaryOpNode.scala:8) 
    at com.mulesoft.weave.engine.ast.selectors.NullSafeNode.doExecute(NullSafeNode.scala:16) 
    at com.mulesoft.weave.engine.ast.ValueNode$class.execute(AstNode.scala:38) 
    at com.mulesoft.weave.engine.ast.selectors.NullSafeNode.execute(NullSafeNode.scala:10) 
    at com.mulesoft.weave.engine.ast.conditional.DefaultNode.doExecute(DefaultNode.scala:13) 
    at com.mulesoft.weave.engine.ast.ValueNode$class.execute(AstNode.scala:38) 
    at com.mulesoft.weave.engine.ast.conditional.DefaultNode.execute(DefaultNode.scala:10) 
    at com.mulesoft.weave.engine.ast.structure.KeyValuePairNode.doExecute(KeyValuePairNode.scala:12) 
    at com.mulesoft.weave.engine.ast.ValueNode$class.execute(AstNode.scala:38) 
    at com.mulesoft.weave.engine.ast.structure.KeyValuePairNode.execute(KeyValuePairNode.scala:10) 
    at com.mulesoft.weave.engine.ast.structure.ObjectNode$$anonfun$4.apply(DynamicObjectNode.scala:39) 
    at com.mulesoft.weave.engine.ast.structure.ObjectNode$$anonfun$4.apply(DynamicObjectNode.scala:38) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245) 
    at scala.collection.Iterator$class.foreach(Iterator.scala:742) 
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1194) 
    at scala.collection.IterableLike$class.foreach(IterableLike.scala:72) 
    at scala.collection.AbstractIterable.foreach(Iterable.scala:54) 
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:245) 
    at scala.collection.AbstractTraversable.map(Traversable.scala:104) 
    at com.mulesoft.weave.engine.ast.structure.ObjectNode.doExecute(DynamicObjectNode.scala:38) 
    at com.mulesoft.weave.engine.ast.ValueNode$class.execute(AstNode.scala:38) 
    at com.mulesoft.weave.engine.ast.structure.ObjectNode.execute(DynamicObjectNode.scala:28) 
    at com.mulesoft.weave.engine.ast.ValueNode$class.write(AstNode.scala:28) 
    at com.mulesoft.weave.engine.ast.structure.ObjectNode.write(DynamicObjectNode.scala:28) 
    at com.mulesoft.weave.engine.Engine.write(Engine.scala:165) 
    at com.mulesoft.weave.engine.Engine.execute(Engine.scala:88) 
    at com.mulesoft.weave.engine.Engine.execute(Engine.scala:103) 
    at com.mulesoft.weave.mule.debug.DebugWeaveExecutorStrategy$$anonfun$execute$1.apply(DebugWeaveExecutorStrategy.scala:30) 
    at com.mulesoft.weave.mule.debug.DebugWeaveExecutorStrategy$$anonfun$execute$1.apply(DebugWeaveExecutorStrategy.scala:28) 
    at scala.Option.map(Option.scala:146) 
    at com.mulesoft.weave.mule.debug.DebugWeaveExecutorStrategy.execute(DebugWeaveExecutorStrategy.scala:28) 
    at com.mulesoft.weave.mule.WeaveMessageProcessor.execute(WeaveMessageProcessor.scala:117) 
    at com.mulesoft.weave.mule.WeaveMessageProcessor.process(WeaveMessageProcessor.scala:65) 
    at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27) 
    at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:108) 
    at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:44) 
    at org.mule.processor.BlockingProcessorExecutor.executeNext(BlockingProcessorExecutor.java:88) 
    at org.mule.processor.BlockingProcessorExecutor.execute(BlockingProcessorExecutor.java:59) 
    at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27) 
    at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:44) 
    at org.mule.processor.BlockingProcessorExecutor.executeNext(BlockingProcessorExecutor.java:98) 
    at org.mule.processor.BlockingProcessorExecutor.execute(BlockingProcessorExecutor.java:59) 
    at org.mule.interceptor.AbstractEnvelopeInterceptor.processBlocking(AbstractEnvelopeInterceptor.java:58) 
    at org.mule.processor.AbstractRequestResponseMessageProcessor.process(AbstractRequestResponseMessageProcessor.java:47) 
    at org.mule.processor.AsyncInterceptingMessageProcessor.processNextTimed(AsyncInterceptingMessageProcessor.java:123) 
    at org.mule.processor.AsyncInterceptingMessageProcessor$AsyncMessageProcessorWorker$1.process(AsyncInterceptingMessageProcessor.java:208) 
    at org.mule.processor.AsyncInterceptingMessageProcessor$AsyncMessageProcessorWorker$1.process(AsyncInterceptingMessageProcessor.java:201) 
    at org.mule.execution.ExecuteCallbackInterceptor.execute(ExecuteCallbackInterceptor.java:16) 
    at org.mule.execution.CommitTransactionInterceptor.execute(CommitTransactionInterceptor.java:35) 
    at org.mule.execution.CommitTransactionInterceptor.execute(CommitTransactionInterceptor.java:22) 
    at org.mule.execution.HandleExceptionInterceptor.execute(HandleExceptionInterceptor.java:30) 
    at org.mule.execution.HandleExceptionInterceptor.execute(HandleExceptionInterceptor.java:14) 
    at org.mule.execution.BeginAndResolveTransactionInterceptor.execute(BeginAndResolveTransactionInterceptor.java:67) 
    at org.mule.execution.ResolvePreviousTransactionInterceptor.execute(ResolvePreviousTransactionInterceptor.java:44) 
    at org.mule.execution.SuspendXaTransactionInterceptor.execute(SuspendXaTransactionInterceptor.java:50) 
    at org.mule.execution.ValidateTransactionalStateInterceptor.execute(ValidateTransactionalStateInterceptor.java:40) 
    at org.mule.execution.IsolateCurrentTransactionInterceptor.execute(IsolateCurrentTransactionInterceptor.java:41) 
    at org.mule.execution.ExternalTransactionInterceptor.execute(ExternalTransactionInterceptor.java:48) 
    at org.mule.execution.RethrowExceptionInterceptor.execute(RethrowExceptionInterceptor.java:28) 
    at org.mule.execution.RethrowExceptionInterceptor.execute(RethrowExceptionInterceptor.java:13) 
    at org.mule.execution.TransactionalErrorHandlingExecutionTemplate.execute(TransactionalErrorHandlingExecutionTemplate.java:110) 
    at org.mule.execution.TransactionalErrorHandlingExecutionTemplate.execute(TransactionalErrorHandlingExecutionTemplate.java:30) 
    at org.mule.processor.AsyncInterceptingMessageProcessor$AsyncMessageProcessorWorker.doRun(AsyncInterceptingMessageProcessor.java:200) 
    at org.mule.work.AbstractMuleEventWork.run(AbstractMuleEventWork.java:53) 
    at org.mule.work.WorkerContext.run(WorkerContext.java:286) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

******************************************************************************** 

什麼建議嗎?

回答

0

我曾與Mulesoft公開問題的情況下,他們提供了這個建議,它的工作原理。 某些屬性應該添加到Dataweave中,然後按需運行。

<dw:reader-property name="nullValueOn" value="blank" /> 

三個案例做工作,無論有多少數據被提供A.B.CA·B一個或什麼都沒有。

%dw 1.0 
%output application/json 
--- 
{ one: payload.a, 
    two: payload.a.b default "y", 
    three: payload.a.b.c default "x" 
} 
0

,你可以使用默認的關鍵字類似

%dw 1.0 
%output application/json 
--- 
{ one: payload.a, 
    two: payload.a.b default "y", 
    three: payload.a.b.c default "x" 
} 

輸入: -

<a> 
    <c>value</c> 
</a> 

輸出

{ 
    "one": { 
    "c": "value" 
    }, 
    "two": "y", 
    "three": "x" 
} 

希望這有助於。

+0

好方法,但如果b不存在DW會產生錯誤。我的實際xpath與payload.a.b.c.d.e.f.g.h相似,並且可能不存在任何這些鏈接。 – Alex

+0

使用哪個版本。對我來說,即使b缺席,DW工作正常。 – AnupamBhusari

+0

最新的一個。版本:6.1.1 內部編號:201609131828 嘗試使用相同的示例,但僅限於輸入。 – Alex