2

我一直在开发一个小应用程序,我需要用 XML 消息来响应,例如

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

我发现编组非常混乱,有没有更好的方法或替代方法?

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

4

4 回答 4

4

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

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

但是,如果消息较长且复杂,您可能很容易使标签的排序复杂化或忘记输入某些内容,这甚至会令人沮丧。

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

于 2013-09-06T19:43:34.167 回答
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>
于 2013-09-06T20:38:08.887 回答
1

看看编组的定义——无论你做什么来生成 XML,你都是在编组它描述的数据!

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

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

public class XmlMarshaller {

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

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

然后,您可能需要附加功能 x、y 和 z,并让 marshaller 在返回您的 xml 之前同时处理大象和保龄球一段时间。

这是此时您的编组器的拟人化可视化

具有大量复杂行为的编组器

看起来并不容易,是吗?

关键是,除了最简单、狭窄的编组功能之外,在像 JAXB 这样的 3rd 方框架上升级的短期痛苦将比编写、增强和维护自己的实现的长期痛苦要小得多

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

于 2013-09-06T21:00:58.503 回答
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 消息所需的全部内容。只是为了好玩,我将使用会破坏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>
于 2013-09-06T20:29:22.520 回答