gpt4 book ai didi

Java Web 服务返回带有 > 和 < 而不是 > 和 < 的字符串

转载 作者:数据小太阳 更新时间:2023-10-29 01:55:37 33 4
gpt4 key购买 nike

我有一个返回字符串的 Java Web 服务。我正在用 DocumentBuilder 创建这个 xml 字符串的主体和 Document类(class)。当我查看返回的 XML 的源代码(在浏览器窗口中看起来不错)而不是 <> 时,它返回 &lt;&gt;围绕 XML 节点。

请帮忙。

****更新(包括代码示例)
该代码不包括任何错误捕获,为简单起见,它被剥离了。包括一个代码块和三个方法:第一个代码块(EXAMPLE SETUP)显示了 Document 对象的基本设置。方法 appendPayment(...)是实际文档构建发生的地方。它调用两个辅助方法 getTagValue(...)prepareElement(...)
**注意,此代码旨在从预先存在的 xml 字符串复制特定部分,xmlString , 并抓取稍后返回的必要信息。

****更新 2在问题末尾添加响应

************ 第一个答案的后续问题在这里:
How to return arbitrary XML Document using an Eclipse/AXIS2 POJO Service

EXAMPLE SETUP
{
//create new document
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder newDocBuilder = docFactory.newDocumentBuilder();
Document newDoc = newDocBuilder.newDocument();
Element rootElement = newDoc.createElement("AllTransactions");

newDoc.appendChild(rootElement);
appendPayment(stringXML, newDoc);
}

public static void appendPayment(String xmlString, Document newDoc) throws Exception
{
//convert string to inputstream
ByteArrayInputStream bais = new ByteArrayInputStream(xmlString.getBytes());
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document oldDoc = docBuilder.parse(bais);
oldDoc.getDocumentElement().normalize();

NodeList nList = oldDoc.getChildNodes();
Node nNode = nList.item(0);
Element eElement = (Element) nNode;

//Create new child node for this payment
Element transaction = newDoc.createElement("Transaction");
newDoc.getDocumentElement().appendChild(transaction);


//status
transaction.appendChild(prepareElement("status", eElement, newDoc));

//amount
transaction.appendChild(prepareElement("amount", eElement, newDoc));
}

private static String getTagValue(String sTag, Element eElement)
{
NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
Node nValue = (Node) nlList.item(0);
return nValue.getNodeValue();
}

private static Element prepareElement(String sTag, Element eElement, Document newDoc)
{
String str = getTagValue(sTag, eElement);
Element newElement = newDoc.createElement(sTag);
newElement.appendChild(newDoc.createTextNode(str));
return newElement;
}

最后我用下面的方法转换成最终的Document反对 String

public static String getStringFromDocument(Document doc)
{
try
{
DOMSource domSource = new DOMSource(doc);
StringWriter writer = new StringWriter();
StreamResult result = new StreamResult(writer);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.transform(domSource, result);
return writer.toString();
}
catch(TransformerException ex)
{
ex.printStackTrace();
return null;
}
}

响应的头类型如下

Server: Apache-Coyote/1.1
Content-Type: text/xml;charset=utf-8
Transfer-Encoding: chunked

这是一个示例响应

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<getTransactionsResponse xmlns="http://services.paypal.com">
<getTransactionsReturn>&lt;AllTransactions&gt;&lt;Transaction&gt;&lt;status&gt;PENDING&lt;/status&gt;&lt;amount&gt;55.55&lt;/amount&gt;&lt;/transaction&gt;
</getTransactionsResponse>
</soapenv:Body>
</soapenv:Envelope>

最佳答案

框架正在做你告诉它的事情;你的方法返回 String这意味着生成的 WSDL 应该有一个类型为 <xsd:string> 的响应消息.正如我们所知,XML 字符串必须将某些字符编码为 character entity references。 (即“<”变为“&lt;”,因此 XML 解析器将其视为字符串,而不是您想要的 XML 元素的开头)。如果要返回 XML 文档,则必须在 WSDL <types> section 中定义 XML 结构。并将响应消息部分设置为适当的元素。

换句话说,您试图在不使用 SOAP/WSDL(即 XML 架构)提供的强类型系统的情况下发送“类型化”数据;这通常被认为是糟糕的设计(参见 Loosely typed versus strongly typed web services)。

最终的解决方案是通过适当的 XML Schema 定义响应文档。 .如果根据您的服务设计没有设置架构,则使用 <xsd:any> type 为消息响应类型,尽管这种方法 has its pitfalls .此外,这样的重新设计意味着模式优先(自上而下)开发模型,从评论流看来,您目前正在实践代码优先(自下而上)方法。也许您的工具提供了一种机制,例如“通用 XML 文档”返回类型或注释,可以达到相同的效果。

关于Java Web 服务返回带有 > 和 < 而不是 > 和 < 的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7849666/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com