是否有使用编组/解组的替代方法?

时间:2013-09-06 19:23:49

标签: java xml jaxb

我一直在开发一个小应用程序,我需要回复XML消息,如

<response>
<message>blah</message>
</response>

我发现编组很混乱,这种方法有更好的方法或替代方法吗?

编辑:我的问题是要了解什么更好?使用编组/解组或更简单的替代方法。

4 个答案:

答案 0 :(得分:3)

作为替代方案,您可以在输出消息中对xml标记进行硬编码,并在这些标记之间添加messagge(blah)。对于像这样的小消息来说,这不会太复杂。像

System.out.println("<response><message>" +
            yourMessageHere + "</message></response>");

但是,如果有更复杂的消息,你可能很容易使标签的顺序复杂化或忘记输入某些东西,甚至可能会令人沮丧。

我建议尝试编组/解组。我为我的一个任务做了这个,我同意你在开始时看起来很复杂,但是一旦你掌握了它,你就不必担心XML的格式良好。

答案 1 :(得分:2)

对于非常简单的文档,您可以使用StAX API而不是构建XML String。这使得引入错误变得更加困难。

演示代码

以下是从您的问题中生成XML所需的StAX调用。只是为了让事情变得有趣,消息中包含一个在XML文档中无效的字符。

import javax.xml.stream.*;

public class StAXDemo {

    public static void main(String[] args) throws Exception {
        XMLOutputFactory xof = XMLOutputFactory.newFactory();
        XMLStreamWriter xsw = xof.createXMLStreamWriter(System.out);

        xsw.writeStartDocument();
        xsw.writeStartElement("response");
        xsw.writeStartElement("message");
        xsw.writeCharacters("1 < 2");
        xsw.writeEndDocument();

        xsw.close();
    }

}

<强>输出

我们在输出中看到<字符已正确转义为&lt;

<?xml version="1.0" ?><response><message>1 &lt; 2</message></response>

答案 2 :(得分:1)

查看definition of marshalling - 无论您如何生成XML,都要编组它描述的数据!

真正的问题是如何实施这种编组。

在这个非常简单的情况下,您可以为自己的Marshaller手动滚动特定数据 - 它可以像硬编码标签一样简单,只需填写消息,如@BeginnerJava已经建议的那样

public class XmlMarshaller {

    public String marshal(String message) {
         return "<response><message>" + message + "</message></response>";
    }
}

然后,正如@yshavit建议的那样,您可能希望确保该消息不包含可能会破坏输出的额外xml标记。

然后你可能想要额外的特征x,y和z,并且在返回你的xml之前,marshaller可以同时处理大象和保龄球一段时间。

此处是你的编组人员的拟人形象化

marshaller with loads of complicated behaviour

看起来不容易,是吗?

关键在于,除了最简单,最简单的编组功能之外,像JAXB这样的第三方框架的短期痛苦将远远超过长期的痛苦令人惊讶写作,增强和维护自己的实施。

因此,当您超越学校作业并开始构建更复杂的应用程序时,请认真考虑花时间学习用于常见任务的现有框架和库 - 例如用于编组的JAXB。从长远来看,这种方法可以使您的代码和生产力更好: - )

答案 3 :(得分:0)

JAXB (JSR-222)非常易于使用。我将在下面举例说明。

域模型

JAXB不需要任何注释(参见:http://blog.bdoughan.com/2012/07/jaxb-no-annotations-required.html),但包含根元素会使事情变得更容易。

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Response {

    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

}

演示代码

<强>演示

以下是生成XML消息所需的全部内容。只是为了好玩,我将使用一条会破坏code given by BeginnerJava的消息。

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Response.class);

        Response response = new Response();
        response.setMessage("1 < 2");

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(response, System.out);
    }

}

<强>输出

在输出中,我们看到<字符已正确转义为&lt;。更难看的是XML输出已被编组为正确的编码。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
    <message>1 &lt; 2</message>
</response>