【问题标题】:How to handle/cleanse invalid 0x14 in XML using Linq?如何使用 Linq 处理/清理 XML 中的无效 0x14?
【发布时间】:2013-03-12 18:48:15
【问题描述】:

我正在开发一个通过 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 中没有看到任何东西,它本身也不会产生错误。 p>

编辑#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 函数。

【问题讨论】:

  • 能否提供一些示例数据给我们?
  • 你可以在这里查看这个解决方案:seattlesoftware.wordpress.com/2008/09/11/…
  • 如果它带有无效字节,那么严格来说它实际上不是XML......只是说......
  • 我添加了 Linq 代码和更多解释。我去看看那个链接。
  • 如果文档以字符串形式出现,您可以只使用string.Replace 错误字符。如果它以 XML 文档的形式出现,您可能会将其转换为字符串,执行 Replace 操作,然后重新创建文档。

标签: c# xml linq


【解决方案1】:

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

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

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

在处理 3rd 方网络服务时,我通常会执行以下操作:

  • 对来自第三个 Web 服务的任何请求和响应启用完整的 XML 架构验证。如果请求或响应不是 XML 架构有效的,那么我们(客户端和服务)就有问题,可能是次要或主要的 - 但至少它正在得到处理。

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2011-10-03
    • 1970-01-01
    • 2011-12-07
    相关资源
    最近更新 更多