我一直在开发一个小应用程序,我需要回复XML消息,如
<response>
<message>blah</message>
</response>
我发现编组很混乱,这种方法有更好的方法或替代方法吗?
编辑:我的问题是要了解什么更好?使用编组/解组或更简单的替代方法。
答案 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();
}
}
<强>输出强>
我们在输出中看到<
字符已正确转义为<
。
<?xml version="1.0" ?><response><message>1 < 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可以同时处理大象和保龄球一段时间。
此处是你的编组人员的拟人形象化
看起来不容易,是吗?
关键在于,除了最简单,最简单的编组功能之外,像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);
}
}
<强>输出强>
在输出中,我们看到<
字符已正确转义为<
。更难看的是XML输出已被编组为正确的编码。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
<message>1 < 2</message>
</response>