如何使用Linq处理/清除XML中的无效0x14?

时间:2013-03-12 18:48:15

标签: c# xml linq

我正在开发一个C#客户端,它通过SOAP从Web服务下载XML文件。对于服务上托管的一些较旧的记录,XML显然会在其中隐藏一个0x14,从而引发“无效的空白字符”异常。我正在使用Linq将XML转储到文件中。有没有办法指示Linq处理无效字符而不丢失XML的其余部分?

编辑:

以下是我目前用于将XML放入文件的代码:

 XDocument c =
            new XDocument(
                new XElement(nameSpace + "getCitationsResponse",
                    new XAttribute(XNamespace.Xmlns + "ns1", nameSpace),
                    new XElement("list",
                        record.reportDateSpecified ? new XElement("reportDate", record.reportDate) : null,
                        new XElement("reportType", record.reportType),
                        new XElement("title", record.title),
                        new XElement("projectNumber", record.projectNumber),
                        new XElement("author", record.author),
                        new XElement("abstract", record.@abstract),
                        new XElement("numPages", record.numPages),
                        record.isDataTypeSpecified ? new XElement("isDataType", record.isRestrictedData) : null,
                        new XElement("comments", record.comments),
                        new XElement("attachments", from a in record.attachments
                                                    select new XElement("list",
                                                        new XElement("id", a.id),
                                                        new XElement("filePath", a.filePath),
                                                        new XElement("type", a.type)))));

由于通常的原因,我不得不将其中的一部分砍掉,但我删除的内容与此处显示的相同。

我在发布之前使用过SoapUI,看看我是否能找出漏洞的位置,但是我没有在SoapUI中看到任何内容,并且它本身不会产生错误。

编辑#2:

这是确切的错误消息和堆栈跟踪。让我想知道我是否可以真正做些什么,或者我是否只需要处理某些事情来记录哪些记录包含无效字符并尝试使用SoapUI手动拉下它们。

Invalid white space character (0x14) in text to output
   at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
   at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
   at Downloader.WebService.ApiService.getRecords(String username, String[] ids)
   at Downloader.Central.RecordLoop(ApiService svc, Int32 offset, String username)

getRecords是由wsdl生成的API调用,而RecordLoop是我编写的递归函数,用于处理迭代API调用以查找更新的记录并将它们推送到我已发布的Linq函数。

1 个答案:

答案 0 :(得分:0)

正如上面的一些评论中所提到的,可以执行不同的忍者技巧来使SOAP响应符合XML规范。

如果您选择更改响应以使其成为有效的XML,则必须认真考虑您的更改是否正在更改响应的含义。

正如我所看到的,问题不在你身边,而是在服务方面。如果可以,您应该尝试让服务所有者升级服务,以便在其Web服务中提供正确格式化的XML。

在处理第三方Web服务时,我通常会执行以下操作:

  • 对来自第三方Web服务的任何请求和响应启用完整的XML Schema验证。如果请求或响应不是XML模式有效,那么我们(客户端和服务)有一个问题,可能是次要的或主要的 - 但至少它是被关注的。

  • 在尝试修复内容之前,请始终记录任何架构验证错误,以确保它已记录在案。

  • 确保我完全了解修改内容的系统,业务或法律影响。

  • 确保我使用正确的编码格式(UTF8,Latin1或其他格式)对响应进行编码。

无效内容通常是包含非法XML字符的xml文本元素。在传输此类文本节点时,服务端应使用XML编码或base64编码,以保留格式和内容。

在实际更改内容以使其变为有效的更技术部分,我通常会添加WCF行为,这样可以解决问题,解决修复xml和业务目的的问题。调用

如果服务更新以便在任何请求时提供有效的XML,那么删除WCF行为也很容易。