Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Linq处理/清除XML中无效的0x14?_C#_Xml_Linq - Fatal编程技术网

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

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

我正在开发一个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函数。

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

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

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

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

  • 对来自第三web服务的任何请求和响应启用完整的XML模式验证。如果请求或响应不是XML模式有效的,那么我们(客户机和服务)就有一个问题,这个问题可以是次要的,也可以是主要的,但至少有人在关注它

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

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

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

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

在实际更改内容以使其生效这一更技术性的部分,我通常会添加WCF行为,这将解决这样做时的问题,将修复xml和服务调用的业务目的分离开来


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

请您为我们提供一些示例数据,好吗?您可以在这里研究这个解决方案:如果它带有无效字节,那么严格地说,它实际上不是XML。。。只是说…我添加了Linq代码和更多的解释。我将查看该链接。如果文档显示为一个字符串,您可以
string。替换
坏字符。如果它是一个XML文档,您可能会将其转换为字符串,执行
替换
操作,然后重新创建文档。