【问题标题】:Invalid XML format in web service responseWeb 服务响应中的 XML 格式无效
【发布时间】:2013-01-11 12:53:28
【问题描述】:

我使用的是 Play 1.2.4,我需要调用第三方网络服务。当我收到响应时,我无法通过 XPath 正确解析它,因为它包含无效的 XML 格式。

响应包含 >< 而不是 <>。我试图解码响应没有运气。我还检查了看起来不错的响应内容“application/soap+xml”。

那么我该如何替换这个字符。除了使用正则表达式的简单字符串替换函数之外,是否有一种优雅的替换/转换方法。

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

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>,而是<tag>

【问题讨论】:

  • 请说明您是如何调用网络服务的。听起来 something 正在转义 XML...
  • String replacement!!!!!!!!!!!! 一个大不 !!
  • @JonSkeet 我用代码示例编辑了文本。感谢您的关注。
  • @InfantPro'Aravind' 我绝对同意你的看法。这就是我问这个问题的原因。
  • @huzeyfe:好的,这看起来是合理的——但是你到底在做什么呢?

标签: xml web-services playframework


【解决方案1】:

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

因此,您应该将<GetFooResult>(或其他)标记的内容作为字符串,然后将其解析为XML 文档。当您将其作为字符串获取时,它会将< 解码为< 等,因此它将是一个有效的文档。 然后您将拥有一个根元素为 TAG1 的文档,然后您可以对其进行查询等。

我建议您使用 Web 服务库进行调用 - 它应该能够抽象出所有内容,因此您可以调用 getFoo() 或其他任何内容来获取结果字符串,然后按照您的预期解析它.

【讨论】:

  • 乔恩,非常感谢您的帮助。 WS 是 PlayFramework 中的一个 Web 服务库。我想你建议另一个图书馆。无论如何,我将此库用于其他第三方 Web 服务没有任何问题,但据我了解,这里的问题是 Web 服务设计得不好。所以你的第一个建议 - 获取标签并重新解析 - 是有道理的,我会选择那个选项。
  • @huzeyfe:但你只是得到一个 HTTP 响应。您想要了解 SOAP 的知识。从您发布的代码的 sn-p 来看,它看起来几乎只是一个 HTTP 库。我不认为 Web 服务本身似乎设计得很糟糕 - 从 Web 服务调用中将 XML 作为字符串返回是合理的。
  • 我明白你的意思。如果有帮助,让我尝试使用不同的库。非常感谢您的好意建议。
【解决方案2】:

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

在这种情况下,我们无能为力!我遇到过这样的场景,其中其他成员遇到了编码不正确的 XML。对于这种情况,我所建议的只是修改生成此类 XML 的代码(如果您有权访问),否则......我们将只剩下正则表达式或字符串操作!虽然不是首选但唯一可用的方法。

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

< 替换为<> 替换为> 的正则表达式模式:

string result = Regex.Replace(Regex.Replace(input, @"(\&lt;)", @"<"), @"(\&gt;)", @">");

【讨论】:

  • 感谢您的回答。所以我们正处于对字符串替换的大忌:)
  • 是的,这是最后但最少的选择......好吧。仍在寻找替代品;)
  • 没有任何 XML DOM 方法会在 XML 文档中添加 &amp;lt;&amp;gt;(CDATA 除外)。如果我猜对了,已经有字符串操作技术被用于使用 innerXML 属性或其他东西添加元素......这是添加节点的最懒惰的方法。我强烈建议摆脱这样的代码!这不好!至少不适用于生产环境:)
  • 我无法摆脱该代码,因为它不受我的控制。无论如何,我需要以某种方式整合它。感谢您的关注:)
  • 不客气。我很乐意提供帮助。我已经用正则表达式代码更新了答案!让我知道我还能为你做些什么:)
猜你喜欢
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 2013-10-24
  • 2011-10-10
  • 2019-04-15
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多