web服务响应中的XML格式无效

web服务响应中的XML格式无效,xml,web-services,playframework,Xml,Web Services,Playframework,我正在使用Play1.2.4,需要调用第三方web服务。当我得到响应时,我无法通过XPath正确解析它,因为它包含无效的XML格式 响应具有和而不是。我试图破译回应,但运气不佳。我还检查了“应用程序/soap+xml”中看起来不错的响应内容 那么我如何才能替换这些字符呢。除了使用正则表达式的简单字符串替换函数外,还有一种优雅的替换/转换方法吗 编辑:这里有一个更好的想法是我如何调用web服务 HttpResponse response = WS.url(WS_URL)

我正在使用Play1.2.4,需要调用第三方web服务。当我得到响应时,我无法通过XPath正确解析它,因为它包含无效的XML格式

响应具有
而不是
。我试图破译回应,但运气不佳。我还检查了“应用程序/soap+xml”中看起来不错的响应内容

那么我如何才能替换这些字符呢。除了使用正则表达式的简单字符串替换函数外,还有一种优雅的替换/转换方法吗

编辑:这里有一个更好的想法是我如何调用web服务

HttpResponse response = WS.url(WS_URL)
                 .setHeader("Content-Type","application/soap+xml") 
                 .body(wsBody)
                 .post();
以下是我要解析的内容:

org.w3.dom.Document xmlDoc = response.getXML();
String textOfSelectedTag = XPath.selectText("tag", xmlDoc);

XPath找不到标记,因为它不是像
那样的格式,它就像
tag

,我想您的XML有很好的根元素!否则
xmlDoc=response.getXML()应该有错误!我认为XML中有很少或很多元素是这样出现的!如果我没有错的话,是Web服务上的XML构建器负责生成这样的文件!这不是因为你阅读它的方式

在这种情况下,我们不能做任何事情!我遇到过这样的情况,同事们遇到了编码不正确的XML。对于这种情况,我所建议的只是修改生成这种XML的代码(如果您有权访问的话),或者。。我们只剩下正则表达式或字符串操作了!这虽然不是首选方法,但却是唯一可用的方法

我见过这样的XML代码的一个原因是,因为使用了字符串连接!所以我的第一个建议是修改生成XML的源代码

用于将
替换为
的正则表达式模式:

string result=Regex.Replace(Regex.Replace(输入,@“(\)”,@”);

好的,看起来这只是一个返回字符串的SOAP方法,而字符串恰好是XML


因此,您应该获得
(或任何内容)的内容标记为字符串,然后将其解析为XML文档。当您将其作为字符串获取时,它将已将
解码为
请显示您如何调用web服务。听起来好像有什么东西正在逃逸XML…
字符串替换
!!!!!!!!!!!!!!!一个大问题!!@JonSkeet我已经用代码示例编辑了文本。谢谢您的参与伊恩。@InfantPro'Aravind'我绝对同意你。这就是我问这个问题的原因。@huzeyfe:好吧,看起来很合理-但是你对这个回答到底做了什么?谢谢你的回答。所以我们正处在一个不允许字符串替换的关键时刻:)是的,这是最后但最不可能的选择。。好。仍在寻找替代方案;)没有XML DOM方法会在XML文档中添加
(CDATA除外)。如果我猜对了的话,有一种字符串操作技术被用来添加使用innerXML属性之类的元素。。这是添加节点的最慢方法。我强烈建议您删除这些代码!这不好!至少不适用于生产环境:)我无法删除该代码,因为它不在我的控制之下。无论如何,我需要整合这个。谢谢你的关注:)非常欢迎。我很乐意帮忙。我已经用正则表达式代码更新了答案!如果我还能为你做什么,请告诉我:)乔恩,非常感谢你的帮助。WS是PlayFramework中的web服务库。我想你建议换一个图书馆。无论如何,我将这个库用于其他第三方web服务没有任何问题,但据我所知,这里的问题是web服务设计得不好。所以你的第一个建议——获取标签并重新分析——是有意义的,我会选择这个选项。@huzeyfe:但你只是得到一个HTTP响应。你想要一些关于肥皂的知识。从您发布的代码片段来看,它看起来就像是一个HTTP库。我不认为web服务本身设计得很糟糕——从web服务调用返回XML作为字符串是合理的。如果有帮助的话,让我试试另一个库。我真的很感激你善意的建议。
string result = Regex.Replace(Regex.Replace(input, @"(\&lt;)", @"<"), @"(\&gt;)", @">");