C# 如何使用Linq处理/清除XML中无效的0x14?
我正在开发一个C#客户机,它通过SOAP从web服务下载XML文件。对于托管在服务上的一些旧记录,XML中的某个地方显然有一个0x14,这引发了一个“无效空白字符”异常。我使用Linq将XML转储到文件中。是否有某种方法可以指示Linq在不丢失XML其余部分的情况下处理无效字符 编辑: 以下是我目前用于将XML放入文件的代码:C# 如何使用Linq处理/清除XML中无效的0x14?,c#,xml,linq,C#,Xml,Linq,我正在开发一个C#客户机,它通过SOAP从web服务下载XML文件。对于托管在服务上的一些旧记录,XML中的某个地方显然有一个0x14,这引发了一个“无效空白字符”异常。我使用Linq将XML转储到文件中。是否有某种方法可以指示Linq在不丢失XML其余部分的情况下处理无效字符 编辑: 以下是我目前用于将XML放入文件的代码: XDocument c = new XDocument( new XElement(nameSpace + "g
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函数。如上面一些评论所述,可以执行不同的忍者技巧,以使SOAP响应符合XML规范
如果选择更改响应以使其成为有效的XML,则必须认真考虑更改是否改变响应的含义。
在我看来,问题不在你方,而是在服务方。如果可以,您应该尝试让服务所有者升级服务,以便在其web服务中提供正确格式的XML 在处理第三方web服务时,我通常会执行以下操作:- 对来自第三web服务的任何请求和响应启用完整的XML模式验证。如果请求或响应不是XML模式有效的,那么我们(客户机和服务)就有一个问题,这个问题可以是次要的,也可以是主要的,但至少有人在关注它
- 在尝试修复内容之前,请始终记录任何架构验证错误,以确保记录在案
- 确保我完全了解修改内容的系统、业务或法律影响
- 确保我使用正确的编码格式(UTF8、Latin1或其他)对响应进行编码
如果或当服务在任何请求下更新以提供有效的XML时,也可以很容易地删除WCF行为。请您为我们提供一些示例数据,好吗?您可以在这里研究这个解决方案:如果它带有无效字节,那么严格地说,它实际上不是XML。。。只是说…我添加了Linq代码和更多的解释。我将查看该链接。如果文档显示为一个字符串,您可以
string。替换坏字符。如果它是一个XML文档,您可能会将其转换为字符串,执行替换
操作,然后重新创建文档。