【发布时间】:2016-01-07 04:52:01
【问题描述】:
我有一个包含无效十六进制字符的 XML。我已阅读 this、this 和 this 以及任何其他链接,但未能成功。
我正在使用 XmlReader - XmlDocument、XDocument 和 XmlTextReader 不是我的选择,因为有超过 500GB 大小和 5 亿容量的 XML 文件。 XMLReader 是我的最佳选择,因为它采用“前向”方法,并且不会将所有 XML 详细信息加载到内存中。此外,正因为如此,我不能重新创建或加载 XML 文件来替换无效字符。
这是我正在处理的代码:
case XmlNodeType.Element:
if (xmlReader.Name.Equals("ROW"))
{
DataRow dataRow = xmlDataTable.NewRow();
XmlReader row = XmlReader.Create(xmlReader.ReadSubtree(), new XmlReaderSettings { CheckCharacters = false
, ValidationType = ValidationType.None });
// iterate on elements inside ROW
// these are the column items
if (row != null)
{
while (row.Read())
{
if (row.IsStartElement())
{
if (!row.Name.Equals("ROW"))
{
string columnName = row.Name;
//row = XmlReader.Create(CleanInvalidXmlChars(row.ReadInnerXml()));
row.Read();
string value = CleanInvalidXmlChars(row.Value.ToString());
// all other logics ...
row.Read(); 语句引发异常。这是我正在阅读的示例 XML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<MFAINSBRP>
<ROW>
<INSTITUTION_CODE>828 </INSTITUTION_CODE>
<BRANCH_CODE>GJ102</BRANCH_CODE>
<BRANCH_NAME> </BRANCH_NAME>
<BRANCH_NAME_FRENCH> </BRANCH_NAME_FRENCH>
<LANGUAGE_CODE>E</LANGUAGE_CODE>
<ADDR_NO>815412</ADDR_NO>
<FAX_AREA>0</FAX_AREA>
<FAX_PHONE>0</FAX_PHONE>
<AREA_CODE>0</AREA_CODE>
<PHONE_NO>0</PHONE_NO>
<STATUS>A</STATUS>
<PHONE_EXT>0</PHONE_EXT>
</ROW>
<!--ALL OTHER RECORDS-->
</MFAINSBRP>
现在,我坚持做这项工作。
编辑:
示例 XML 文件是使我的代码中断的记录。我从 Notepad++ 复制粘贴在这里,但它没有显示无效字符。这是它在 Notepad++ 中的样子:
我如何创建xmlReader 对象就是这个简单的语句:
using (xmlReader = XmlReader.Create(filePath, new XmlReaderSettings { CheckCharacters = false }))
【问题讨论】:
-
文件在哪里失败了?我希望异常会向您显示行/列。
-
此示例 XML 是否包含会破坏您的代码的问题输入示例?如果是这样,你能以某种方式突出它吗?如果没有,您能否创建一个确实显示问题的示例?
-
stackoverflow.com/questions/5742543/… 可能是相关的。该文件是错误的,因此您需要先对其进行预处理并删除有问题的字符。您也许可以使用中间流来做到这一点。
-
这应该和读入数据库有些关系。如果是这样,那么使用后端数据库的 XML 读取功能不是更可行。 "Invalid hexadecimal characters" - 一个十六进制字符怎么会是无效的。
-
您最初提供的 XML 文件很好 - 因为您粘贴了空格而不是其他任何内容。现在您已经在 Notepad++ 中展示了它,我们可以看到它为什么会损坏……是的,它只是无效的 XML。您从哪里获得 XML?你能解决这个问题吗?在可能的情况下,您最好确保永远不会有无效数据,而不是稍后尝试清理它。