这可能是疯狂/愚蠢/愚蠢/冗长的问题之一,因为我是网络服务的新手.
我想写一个Web服务,它将以XML格式返回答案(我正在使用我的服务进行YUI自动完成).我正在使用Eclipse和Axis2并遵循http://www.softwareagility.gr/index.php?q=node/21
我希望以下列格式回复
<codes>
<code value="Pegfilgrastim"/>
<code value="Peggs"/>
<code value="Peggy"/>
<code value="Peginterferon alfa-2 b"/>
<code value="Pegram"/>
</codes>
代码元素的数量可能因响应而异.
直到现在我尝试了以下方法
1)使用String buffer创建XML并返回字符串.(我提供部分代码以避免混淆)
public String myService ()
{
// Some other stuff
StringBuffer outputXML = new StringBuffer();
outputXML.append("<?xml version='1.0' standalone='yes'?>");
outputXML.append("<codes>");
while(SOME_CONDITION)
{
// Some business logic
outputXML.append("<code value=\""+tempStr+"\">"+"</code>");
}
outputXML.append("</codes>");
return (outputXML.toString());
}
它提供以下响应,包含不需要的< ns:myServiceResponse>和< ns:return>元件.
<ns:myServiceResponse>
<ns:return>
<?xml version='1.0' standalone='yes'?><codes><code value="Peg-shaped teeth"></code><code value="Pegaspargase"></code><code value="Pegfilgrastim"></code><code value="Peggs"></code><code value="Peggy"></code><code value="Peginterferon alfa-2 b"></code><code value="Pegram"></code></codes>
</ns:return>
</ns:findTermsResponse>
但它没有使用YUI自动完成(可能是因为它需要上面提到的格式的响应)
2)使用DocumentBuilderFactory:
喜欢
public Element myService ()
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = factory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
Element codes = doc.createElement("codes");
while(SOME_CONDITION)
{
// Some business logic
Element code = doc.createElement("code");
code.setAttribute("value", tempStr);
codes.appendChild(code);
}
return(codes);
}
得到以下错误
org.apache.axis2.AxisFault: Mapping qname not fond for the package: com.sun.org.apache.xerces.internal.dom
3)使用servlet:我尝试使用简单的servlet获得相同的响应并且它有效.这是我的servlet
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
StringBuffer outputXML = new StringBuffer();
response.setContentType("text/xml");
PrintWriter out = response.getWriter();
outputXML.append("<?xml version='1.0' standalone='yes'?>");
outputXML.append("<codes>");
while(SOME_CONDITION)
{
// Some business logic
outputXML.append("<code value=\"" + tempStr + "\">" + "</code>");
}
outputXML.append("</codes>");
out.println(outputXML.toString());
}
它给出了与上面提到的相同的响应,它与YUI自动完成一起工作,没有任何额外的标记.
请问您能告诉我如何在没有任何不需要的元素的情况下获得XML响应?
谢谢.
解决方法:
Axis2用于将对象传递回调用者.这就是为什么它为响应添加额外的东西,即使它是一个简单的String对象.
使用第二种方法,您的服务返回一个复杂的Java对象(Element实例),用于描述XML片段.这样调用者必须知道该对象能够对其进行反序列化并恢复包含XML数据的Java对象.
第三种方法是关于返回类型的最简单和最好的方法:它不返回序列化的Java对象,只返回纯xml文本.当然你可以使用DocumentBuilder来准备XML,但最后你必须通过调用相应的getXml(),asXml()方法(或者……的类型)来创建它的String.