0

我通过 Websphere Message Broker 收到一个 XML 文件,但是当我使用 Java 处理它时,它在输出中给了我一个非格式化文件。

XML 输入文件:

<?xml version="1.0" encoding="UTF-8"?>
<article href="http://www.ensa-agadir.ac.ma/arti234">
    <titre>application de web sémantique</titre>
    <nombrePages>12</nombrePages>
    <auteur rond="principale">
        <nom>Hassani</nom>
        <prenom>Jamal</prenom>
        <etablissement>Ensa-Agadir</etablissement>
    </auteur>
</article>

Java 计算(用于处理消息):

MbMessage outMessage = new MbMessage();
MbMessageAssembly outAssembly = new MbMessageAssembly(assembly, outMessage);
MbElement omroot = outMessage.getRootElement();
MbElement xmlnsc = omroot.createElementAsLastChild ("XMLNSC");
MbElement valueEl = xmlnsc.createElementAsFirstChild(MbElement.TYPE_VALUE, "VALUE", 
                new String ((byte[])message.getRootElement ().getFirstElementByPath("/BLOB/BLOB").getValue()));
out.propagate(outAssembly);

XML 输出文件: 在此处输入图像描述

就像它无法识别任何 utf-8 字符一样:引号<>等...所以我认为将传入的文件转换为文本将解决问题。但我不知道该怎么做,或者它是否是最好的解决方案。

你对此有什么想法吗?谢谢 :)

编辑:消息不应该只是被转义,它应该被转换并很好地编码到输出中。

4

4 回答 4

1

好吧,我找到了解决方案。我必须在HTTP 输入节点中选择XMLNSC 解析器,而不是默认的 BLOB 解析器,并且我必须更改我的Java Compute代码:

MbMessage outMessage = new MbMessage();
MbMessageAssembly outAssembly = new MbMessageAssembly(assembly, outMessage);
MbElement omroot = outMessage.getRootElement();
MbElement xmlnsc = omroot.createElementAsLastChild ("XMLNSC");
MbElement valueEl = xmlnsc.createElementAsFirstChild(MbElement.TYPE_VALUE, "VALUE", 
            new String ((byte[])message.getRootElement ().getFirstElementByPath("XMLNSC/article/titre").getValue()));

// And use getFirstElementByPath field by field not trying to display all of it like text

out.propagate(outAssembly);

谢谢你们 :)

于 2013-03-18T11:30:51.213 回答
0

这里的问题是您正在创建单个 xml 元素,其值是将整个输入消息作为 blob。

最好的办法是修改输入节点属性以使用 xmlnsc 解析器。

或者,您需要更新您的 java 以使用 CreateElementAsLastChildFromBitstream() 解析 blob

这里有一个例子:

http://publib.boulder.ibm.com/infocenter/wmbhelp/v8r0m0/topic/com.ibm.etools.mft.doc/ac30350_.htm

于 2013-03-14T13:06:29.917 回答
0

实际上,您甚至可以进一步简化它,有一个方法 Mbelement.getValueAsString() 可以节省您必须使用强制转换为字节数组和 String 构造函数。

所以例如你的

MbElement valueEl = xmlnsc.createElementAsFirstChild(MbElement.TYPE_VALUE, "VALUE", new String( (byte[]) message.getRootElement().getFirstElementByPath("XMLNSC/article/titre").getValue()));

变成:

MbElement valueEl = xmlnsc.createElementAsFirstChild(MbElement.TYPE_VALUE, "VALUE", message.getRootElement().getFirstElementByPath("XMLNSC/article/titre").getValueAsString());

于 2013-03-21T13:27:02.693 回答
-1

我在 java 中不太好,但我观察到该符号是用 html 实体值转换的,请参阅此链接http://www.w3schools.com/tags/ref_entities.asp您可以获得所有实体。

不要投反对票,我只是根据我的知识帮助他我观察到的东西。

于 2013-03-13T18:45:13.363 回答