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

本文关键字:无效 0x14 XML 清理 何使用 Linq 处理 | 更新日期: 2023-09-27 18:03:46

我正在开发一个通过SOAP从web服务下载XML文件的c#客户端。对于托管在服务上的一些较旧的记录,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函数。

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

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

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

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

处理第三方web服务时,我通常这样做:

  • 对来自第三方web服务的任何请求和响应启用完整的XML Schema验证。如果请求或响应不是XML模式有效的,那么我们(客户端和服务)就有问题了,可能是小问题,也可能是大问题,但至少它正在被处理。

  • 在尝试修复内容之前,总是记录任何模式验证错误,以确保它被记录。

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

  • 确保我使用正确的编码格式编码响应- UTF8, Latin1或其他。

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

在实际更改内容使其有效的更技术性的部分上,我通常会添加WCF行为,这将解决这样做的问题,将修复xml和服务调用的业务目的的关注点分开。

删除WCF行为也很容易,如果或者当服务更新为在任何请求中提供有效的XML时。