【问题标题】:Reading XML file with Invalid character读取包含无效字符的 XML 文件
【发布时间】:2011-02-17 03:26:09
【问题描述】:

我正在使用 Dataset.ReadXML() 来读取 XML 字符串。我收到一个错误,因为 XML 字符串包含无效字符 0x1F,即 'US' - 单位分隔符。这包含在完全形成的标签中。

使用 Perl 脚本从 Oracle DB 中提取数据。如何转义这个字符以便正确读取 XML。

编辑:XML 字符串:

<RESULT>
<DEPARTMENT>Oncology</DEPARTMENT> 
<DESCRIPTION>Oncology</DESCRIPTION> 
 <STUDY_NAME>**7360C hsd**</STUDY_NAME> 
 <STUDY_ID>27</STUDY_ID> 
</RESULT>

在粗体部分的C和h之间,是有一个美国分隔符的地方,当粘贴到这里时实际上显示一个空格。所以我想知道如何在 XML 字符串中忽略它?

【问题讨论】:

  • 你能发一段 xml 搅拌的摘录吗?
  • 如上粘贴了,但是出来的很奇怪?
  • 您需要选择 XML 并按 Control-K 将其放入代码块中。我为你做了。
  • 当它不是 XML 时,请不要将其称为“XML 字符串”。您需要更正创建无效 XML 的进程,而不是修复读取它的进程。

标签: c# xml


【解决方案1】:

如果您查看section 2.2 of the XML recommendation,您会发现 x01F 不在 XML 文档中允许的字符范围内。因此,虽然您正在查看的字符串对您来说可能看起来像一个 XML 文档,但它不是一个。

你有两个问题。相对较小的一个是如何处理这个文件。我可能会预处理字符串并丢弃任何在格式良好的 XML 中不合法的字符,但是我对这个相对较大的问题一无所知。

相对较大的问题是:这些数据首先在那里做什么? (可能)人类可读数据字段中间的不可见 ASCII 字符有什么用途(如果有)?为什么产生这个字符串的 Perl 脚本在遇到非法字符时不会失败?

我和你打赌一美元,这是因为编写该脚本的人使用字符串操作而不是 XML 库来发出 XML 文档。这就是为什么,正如我一再说过的,您应该永远不要使用字符串操作来生成 XML。 (当然也有例外。例如,如果您正在编写一次性应用程序或 XML 解析器。或者如果您的名字是 Tim Bray。)

【讨论】:

  • 数据是(显然)最初存储在 MS Access 文件中的旧数据,已移至 SQl,现在需要可供查看。我正在使用 XML 库:search.cpan.org/~bholzman/XML-Generator-1.03/Generator.pm,虽然我刚刚切换到该库,因为之前的版本使用的是字符串操作。
  • 如果您使用 XML 库,坏数据的问题仍然存在,但至少您已经消除了编写格式不正确的 XML 的“XML 字符串”的问题。您仍然必须弄清楚如何处理不良数据并修复它。但至少现在你正在将它修复在近似正确的位置。
【解决方案2】:

您的 XmlReader/TextReader 必须使用正确的编码创建。您可以按如下方式创建它并传递给您的 Dataaset:

StreamReader reader = new StreamReader("myfile.xml",Encoding.ASCII); // or correct encoding
myDataset.ReadXml(reader);

【讨论】:

  • 我得到'路径中的非法字符'?
  • 那必须来自 StreamReader 和你传递的路径。仔细检查您的路径。
  • 下午试一试。谢谢。
  • -1 - 编码不会让您免于数据中的随机垃圾。
猜你喜欢
  • 2019-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多