如何使用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函数。
正如上面的一些评论所提到的,可以执行不同的忍者技巧来获得符合XML规范的SOAP响应。
如果您选择更改响应以使其成为有效的XML,则必须认真考虑您的更改是否正在更改响应的含义。
在我看来,问题不在你这方面,而在服务方面。如果可以,您应该尝试让服务所有者升级服务,以便在其web服务中提供正确格式的XML。处理第三方web服务时,我通常这样做:
对来自第三方web服务的任何请求和响应启用完整的XML Schema验证。如果请求或响应不是XML模式有效的,那么我们(客户端和服务)就有问题了,可能是小问题,也可能是大问题,但至少它正在被处理。
在尝试修复内容之前,总是记录任何模式验证错误,以确保它被记录。
确保我完全了解修改内容的系统,业务或法律影响。
确保我使用正确的编码格式编码响应- UTF8, Latin1或其他。
无效内容通常是包含非法xml字符的xml文本元素。在传输这些文本节点时,服务端应该使用XML编码或base64编码,以保留格式和内容。
在实际更改内容使其有效的更技术性的部分上,我通常会添加WCF行为,这将解决这样做的问题,将修复xml和服务调用的业务目的的关注点分开。
删除WCF行为也很容易,如果或者当服务更新为在任何请求中提供有效的XML时。