我一直在开发一个小应用程序,我需要用 XML 消息来响应,例如
<response>
<message>blah</message>
</response>
我发现编组非常混乱,有没有更好的方法或替代方法?
编辑:我的问题是对什么更好?使用编组/解组或该方法的一些更简单的替代方法。
作为替代方案,您可以对输出消息中的 xml 标签进行硬编码,并在这些标签之间添加您的消息(等等)。对于这样的小消息来说,它不会太复杂。喜欢
System.out.println("<response><message>" +
yourMessageHere + "</message></response>");
但是,如果消息较长且复杂,您可能很容易使标签的排序复杂化或忘记输入某些内容,这甚至会令人沮丧。
我建议尝试编组/解组。我是为我的一项任务做的,我同意当你开始的时候它看起来很复杂,但是一旦你掌握了它,你就不必担心你的 XML 的格式是否正确。
对于非常简单的文档,您可以使用 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();
}
}
输出
我们在输出中看到该<
字符被正确转义为<
.
<?xml version="1.0" ?><response><message>1 < 2</message></response>
看看编组的定义——无论你做什么来生成 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。从长远来看,这种方法将使您的代码和生产力大大提高:-)
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);
}
}
输出
在输出中,我们看到该<
字符已正确转义为<
. 更难看到的是 XML 输出已被编组为正确的编码。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
<message>1 < 2</message>
</response>