【问题标题】:Edit XML through JAVA and MULE通过 JAVA 和 MULE 编辑 XML
【发布时间】:2025-12-03 04:10:01
【问题描述】:

----->解决方法见本题结尾vvvvvvv

我正在尝试使用 Mule 编辑 XML 文件,但无法运行。

我正在尝试的流程是:

我写的java-transform中的代码是:

package se.xcorp.mulecomponents;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.channels.FileChannel;

import org.mule.api.MuleMessage;
import org.mule.api.transformer.TransformerException;
import org.mule.api.transport.PropertyScope;
import org.mule.config.i18n.MessageFactory;
import org.mule.transformer.AbstractMessageTransformer;

public class checkXML extends AbstractMessageTransformer
{    
@Override
public Object transformMessage(MuleMessage message, String outputEncoding)
        throws TransformerException {


      try {

            SAXBuilder builder = new SAXBuilder();
//              

            Document doc = (Document) builder.build((java.io.InputStream)message);
            Element rootNode = doc.getRootElement();

            // update staff id attribute
            String workpl = rootNode.getChildText("Arb_plats_ID");
            if (workpl==""){
                System.out.println("Empty!!!!");
                rootNode.getChild("Arb_plats_ID").setText("0");
            } else {
                System.out.println(workpl);
            }


            XMLOutputter xmlOutput = new XMLOutputter();

            // display nice nice
            xmlOutput.setFormat(Format.getPrettyFormat());
            xmlOutput.output(doc, new FileWriter("c:\\JAVATEST\\DATAUT\\1.xml"));

            // xmlOutput.output(doc, System.out);

            System.out.println("File updated!");
          } catch (IOException io) {
            io.printStackTrace();
          } catch (JDOMException e) {
            e.printStackTrace();
          }

    return null;
}


}

例外是:

++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++ + 启动应用程序 'xmlchecknedit' + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++ INFO 2013-11-07 16:24:27,943 [[xmlchecknedit].connector.file.mule.default.receiver.01] org.mule.transport.file.FileMessageReceiver:在文件中获得锁定:C:\JAVATEST\DATAIN\ 40171700_100470.xml 错误 2013-11-07 16:24:28,049 [[xmlchecknedit].XMLcheckneditFlow2.stage1.02] org.mule.exception.DefaultMessagingExceptionStrategy:


消息:org.mule.DefaultMuleMessage 无法转换为 java.io.InputStream (java.lang.ClassCastException)。消息负载类型:byte[]

代码:MULE_ERROR--2

异常堆栈是: 1. org.mule.DefaultMuleMessage 无法转换为 java.io.InputStream (java.lang.ClassCastException) se.hansandersson.mulecomponents.checkXML:36(空) 2. org.mule.DefaultMuleMessage 无法转换为 java.io.InputStream (java.lang.ClassCastException)。消息负载类型:byte[] (org.mule.api.transformer.TransformerMessagingException)

org.mule.transformer.AbstractTransformer:139 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transformer/TransformerMessagingException.html)

根异常堆栈跟踪: java.lang.ClassCastException: org.mule.DefaultMuleMessage 不能转换为 java.io.InputStream 在 se.hansandersson.mulecomponents.checkXML.transformMessage(checkXML.java:36) 在 org.mule.transformer.AbstractMessageTransformer.transform(AbstractMessageTransformer.java:145) 在 org.mule.transformer.AbstractMessageTransformer.transform(AbstractMessageTransformer.java:93) + 3 个以上(设置调试级别日志记录或 '-Dmule.verbose.exceptions=true' 为所有内容)


感谢您提供任何帮助以使其正常工作!

我仍然无法让它工作,我想做的是做下面的 Java 代码所做的事情,但把它放到一个骡子流中来处理文件管理。 Java 检查 XML-element-child 是否为空,如果为空,则将其更新为“0”。

这个 java 代码的工作方式就像我不想要的那样,但我无法将它转换为 mule 流。请帮忙! /克拉斯

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

public class ModifyXMLFile {
public static void main(String[] args) {

  try {

    SAXBuilder builder = new SAXBuilder();
    File xmlFile = new File("c:\\JAVATEST\\DATAIN\\1.xml");

    Document doc = (Document) builder.build(xmlFile);
    Element rootNode = doc.getRootElement();

    // update staff id attribute
    String workpl = rootNode.getChildText("Arb_plats_ID");
    if (workpl==""){
        System.out.println("Empty!!!!");
        rootNode.getChild("Arb_plats_ID").setText("0");
    } else {
        System.out.println(workpl);
    }


    XMLOutputter xmlOutput = new XMLOutputter();

    // display nice nice
    xmlOutput.setFormat(Format.getPrettyFormat());
    xmlOutput.output(doc, new FileWriter("c:\\JAVATEST\\DATAUT\\1.xml"));

    // xmlOutput.output(doc, System.out);

    System.out.println("File updated!");
  } catch (IOException io) {
    io.printStackTrace();
  } catch (JDOMException e) {
    e.printStackTrace();
  }
}
}

解决方案!!!!

这里是 Mule XML 和 Java 类,它们一起检查 XML 元素是否为空,如果它被分配 0 给它,然后将它传递回流以保存。

MULE XML-----------------------------------

    <flow name="XMLcheckneditFlow2" doc:name="XMLcheckneditFlow2">
    <file:inbound-endpoint path="C:\JAVATEST\DATAIN" responseTimeout="10000"    doc:name="File">

    </file:inbound-endpoint>
     <byte-array-to-string-transformer doc:name="Byte Array to String"></byte-array-to-string-transformer>
    <custom-transformer class="se.hansandersson.mulecomponents.checkXML" doc:name="Java"/>
    <file:outbound-endpoint path="C:\JAVATEST\DATAUT" responseTimeout="10000" doc:name="File"/>
</flow>
</mule>

JAVA代码-------------------------------------------

public class checkXML extends AbstractMessageTransformer
{   
@Override
public Object transformMessage(MuleMessage message, String outputEncoding)
        throws TransformerException {
    String returnstring="";


    try {
        String  xmlString = (String)message.getPayload();
        SAXBuilder saxBuilder = new SAXBuilder();
                InputStream stream = new ByteArrayInputStream(xmlString.getBytes("UTF-8"));
                Document doc = saxBuilder.build(stream);

            Element rootNode = doc.getRootElement();

            // update staff id attribute
            String workpl = rootNode.getChildText("Arb_plats_ID");
            if (workpl==""){
                System.out.println("Empty!!!!");
                rootNode.getChild("Arb_plats_ID").setText("0");
            } else {
                System.out.println(workpl);
            }


            XMLOutputter xmlOutput = new XMLOutputter();

            // display nice nice

            returnstring = xmlOutput.outputString(doc);


            System.out.println("File updated!");


          } catch (IOException io) {
            io.printStackTrace();
          } catch (JDOMException e) {
            e.printStackTrace();
          }

    return returnstring;
}

【问题讨论】:

    标签: xml file mule


    【解决方案1】:

    试试这个方法。

    <file:inbound-endpoint path=""  ......  >
         <byte-array-to-string-transformer></byte-array-to-string-transformer>      
    </file:inbound-endpoint>
    
     <component  ....  java component>
    

    这样,您可以将传入的文件作为 XMLStreamReader 放入您的 Java 组件中,在其中可以应用 SAXParser 来读取和转换它。

    String  xmlString = (String)message.getPayload();
    SAXBuilder saxBuilder = new SAXBuilder();
            InputStream stream = new ByteArrayInputStream(xmlString.getBytes("UTF-8"));
            Document doc = saxBuilder.build(stream);
    

    该文件将在 Java 组件中以字符串形式提供。您可以使用解析器对其进行转换。

    希望这会有所帮助。

    【讨论】:

    • 我已在问题中添加了 som 信息。我仍然无法让这个工作。也许我从错误的方向解决问题?
    • 我也认为 XSLT 应该这样做,但它不适合条件编辑,而且我对传入文件的问题是有时 XML 标记中有数据,有时没有。然后 XML 文件将通过 XSLT 中的映射方案传递给 XSLT Transformer,如果映射的标记为空,则 XSLT 转换将失败。