使用 XmlDocument.Load(path); 方法来读取一个encoding为utf-16的xml时,就报了以上异常。

Xml文件:

[html] view plaincopy print?
  1. <?xml version="1.0" encoding="utf-16"?>
  2. <DataProviders>
  3. <Provider
  4. Name="A"
  5. Type="OleDataProvider"
  6. ConnectionString="Provider=SQLOLEDB.1;Password=xx;User ID=sa;Data Source=192.168.1.x\SQL2008;Initial Catalog=xxx" />
  7. <Provider
  8. Name="B"
  9. Type="SubSonic.SqlDataProvider, SubSonic"
  10. ConnectionString="Password=xx;Persist Security Info=True;User ID=sa;Database=xx;Data Source=192.168.1.x\SQL2008" />
  11. </DataProviders>

<?xml version="1.0" encoding="utf-16"?>
<DataProviders><ProviderName="A"Type="OleDataProvider"ConnectionString="Provider=SQLOLEDB.1;Password=xx;User ID=sa;Data Source=192.168.1.x\SQL2008;Initial Catalog=xxx" /><ProviderName="B"Type="SubSonic.SqlDataProvider, SubSonic"ConnectionString="Password=xx;Persist Security Info=True;User ID=sa;Database=xx;Data Source=192.168.1.x\SQL2008" />
</DataProviders>

在网上找了一下都不知道怎么解决。经过摸索以及Msdn上的启发,得出以下解决方案:

1. 将 uft-16 修改成 utf-8

这是最简单的方式,但是由于我们项目中该xml文件已经在客户进行了部署,并且系统其他地方也都有对该文件进行操作,为了保证系统稳定性,这种方式只能被抛弃。

2. 将 xml 文件编码修改成 Unicode

既然是字符编码导致,修改文件编码也可以解决问题,但是仍然会影响稳定性。

3. 将 xml 文件以文本的方式读取进字符串,再通过 LoadXml 方式加载到 XmlDocument 中。

[csharp] view plaincopy print?
  1. string xmlContent = File.ReadAllText(path);
  2. XmlDocument xmlDoc = new XmlDocument();
  3. xmlDoc.LoadXml(xmlContent);

string xmlContent = File.ReadAllText(path);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlContent);

参考:

http://stackoverflow.com/questions/310669/why-does-c-sharp-xmldocument-loadxmlstring-fail-when-an-xml-header-is-included

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Data;
namespace AddMyUtility
{
    public class XmlOperateFuntion
    {
        public static void singleCommandXmlDocumentCreateFunction(string path)//新加创建单条指令xml方法
        {
XmlTextWriter xtw = new XmlTextWriter(path, Encoding.Unicode);
            xtw.Formatting = Formatting.Indented;
            xtw.WriteStartDocument();
            xtw.WriteStartElement("SingleCommandList");
            xtw.WriteAttributeString("xmlns:xsi", "http:www.w3.org/2001/XMLSchema-instance");
            xtw.WriteStartElement("Commands");
            xtw.WriteEndElement();
            xtw.WriteEndElement();
            xtw.WriteEndDocument();
            xtw.Close();
}
        public static void commandChainXmlDocumentCreateFunction(string path)//新加创建指令链列表xml方法
        {
XmlTextWriter xtw = new XmlTextWriter(path, Encoding.Unicode);
            xtw.Formatting = Formatting.Indented;
            xtw.WriteStartDocument();
            xtw.WriteStartElement("CommandChainDocument");
            xtw.WriteAttributeString("xmlns:xsi", "http:www.w3.org/2001/XMLSchema-instance");
            xtw.WriteStartElement("CommandChainGroups");
            xtw.WriteEndElement();
            xtw.WriteEndElement();
            xtw.WriteEndDocument();
            xtw.Close();
}
        public static DataTable SearchFromXml(string filePath,string targetPath, string projectID)//单个卫星单条指令xml文件返回数据表
        {
            string convertPath=changeEncodingMode(filePath, ref targetPath);
            DataTable dt = new DataTable();
            XmlTextReader reader = new XmlTextReader(convertPath);
            List<singleCommandModelType> singleCommandList = new List<singleCommandModelType>();
            singleCommandModelType scm = new singleCommandModelType();
            while (reader.Read() != null)
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    if (reader.Name == "CommandText")
                    { scm.commandType = reader.ReadElementString().Trim(); }
                    if (reader.Name == "Description")
                    { scm.commandDescription = reader.ReadElementString().Trim(); }
if (reader.Name == "Value")
                    {
                        scm.commandValue = reader.ReadElementString().Trim();
                    }
                    if (reader.Name == "SendTime")
                    {
                        scm.sendDatetime = DateTime.Parse(reader.ReadElementString().Trim());
                    }
}
                if (reader.NodeType == XmlNodeType.EndElement)
                {
                    singleCommandList.Add(scm);
                    scm = new singleCommandModelType();
                }
}
            dt.Columns.Add("ID");
            dt.Columns.Add("CommandType");
            dt.Columns.Add("CommandValue");
            dt.Columns.Add("CommandSendTime");
            dt.Columns.Add("CommandBytes");
            dt.Columns.Add("CommandProjectCode");
            dt.Columns.Add("CommandTypeAndValue");
            foreach (singleCommandModelType item in singleCommandList)
            {
                dt.Rows.Add("", item.commandType, item.commandValue, item.sendDatetime, "", "", "");
}
            reader.Close();
            return dt;

        }
        public static DataTable SearchCommandResult(string commandSource, DataTable dt)//查询指令返回表结果
        {
            DataTable rsultDT = new DataTable();
            rsultDT.Columns.Add("ID");
            rsultDT.Columns.Add("CommandType");
            rsultDT.Columns.Add("CommandValue");
            rsultDT.Columns.Add("CommandSendTime");
            rsultDT.Columns.Add("CommandBytes");
            rsultDT.Columns.Add("CommandProjectCode");
            rsultDT.Columns.Add("CommandTypeAndValue");
            foreach (DataRow dr in dt.Rows)
            {
                if (dr["CommandType"] == commandSource)
                {
                    rsultDT.Rows.Add(dr);
}
}
            return rsultDT;
}
        public static string changeEncodingMode(string sourcePath,ref string tempPath)//将UNICODE格式编码转换成UTF8格式
        {
        XmlDocument document = new XmlDocument();
        string content = System.IO.File.ReadAllText(sourcePath);
        content.Replace("utf-16", "Unicode");
                    document.LoadXml(content);
                    document.Save(tempPath);
                    return tempPath;
       
        }
      
    }
public class singleCommandModelType//单条指令类型
    {
        public string commandType { get; set; }
        public string commandValue { get; set; }
        public string commandDescription { get; set; }
        public DateTime sendDatetime { get; set; }
}
}

C#XmlDocument无法读取utf-16文件相关推荐

  1. XML(3)XDocument与XmlDocument递归读取xml文件

    通过XDocument与XmlDocument将xml文件读取到TreeView上,其中主要是用递归方式将xml下的元素都加载到TreeView控件上面. XDocument 步骤: (1)加载xml ...

  2. b是python文件二进制打开,Python核心编程16 ----- 文件的打开(读取),修改,关闭,二进制...

    ctrl + 左键点击 进入模块 1.文件打开 文件(file) 通过Python程序来对计算机中的各种文件进行增删改查的操作 --- I/O(Input/Output) 操作文件 1.打开文件 2. ...

  3. Python核心编程16 ----- 文件的打开(读取),修改,关闭,二进制

    ctrl + 左键点击 进入模块 1.文件打开 文件(file) 通过Python程序来对计算机中的各种文件进行增删改查的操作 --- I/O(Input/Output) 操作文件 1.打开文件 2. ...

  4. 计算机目录读取,从项目目录中读取SQL查询文件(Read SQL query file from project directory)...

    从项目目录中读取SQL查询文件(Read SQL query file from project directory) 我在Visual Studio项目中放置了3个特别大的SQL查询,位于项目目录中 ...

  5. TensorFlow数据读取机制:文件队列 tf.train.slice_input_producer和 tf.data.Dataset机制

    TensorFlow数据读取机制:文件队列 tf.train.slice_input_producer和tf.data.Dataset机制 之前写了一篇博客,关于<Tensorflow生成自己的 ...

  6. 不经保存,直接读取上传文件

    不经保存,直接读取上传文件的内容   <%@ Page Language="C#" AutoEventWireup="true" %> <!D ...

  7. python dicom图像分割_python读取DICOM头文件的实例

    这篇文章主要介绍了关于python 读取DICOM头文件的实例,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 用dicompyler软件打开dicom图像,头文件如图所示: 当然也可以 ...

  8. 利用Python读取外部数据文件

    不论是数据分析,数据可视化,还是数据挖掘,一切的一切全都是以数据作为最基础的元素.利用Python进行数据分析,同样最重要的一步就是如何将数据导入到Python中,然后才可以实现后面的数据分析.数据可 ...

  9. java使用poi(XSSFWorkbook)读取excel(.xlsx)文件

    其中最主要的区别在于jxl不支持.xlsx,而poi支持.xlsx 这里介绍的使用poi方式(XSSFWorkbook),实际上poi提供了HSSFWorkbook和XSSFWorkbook两个实现类 ...

  10. 读取云服务器文件列表,读取云服务器文件列表

    读取云服务器文件列表 内容精选 换一换 登录Windows操作系统的弹性云服务器时,需使用密码方式登录.因此,用户需先根据创建弹性云服务器时使用的密钥文件,获取该弹性云服务器初始安装时系统生成的管理员 ...

最新文章

  1. [转]详解编译预处理
  2. Flutter Web实战项目打造真正跨平台应用(windows,android,ios,linux,macos,web)
  3. klearn 文本分类_使用gensim和sklearn搭建一个文本分类器
  4. KOL:Key Opinion Leader
  5. 修改ant design vue中的Icon图标颜色
  6. form表单、控制器中接收表单提交数据的4种方式
  7. 【积少成多】vi的进阶使用
  8. [转帖]成为合格系统管理员的标准
  9. c语言for嵌套循环语句,关于for嵌套循环语句的疑问
  10. ChainerCV︱堪比Opencv--深度学习工具库(Faster R-CNN、SSD 和 SegNet)
  11. 2048游戏回顾三:自定义Dialog和ProgressBar
  12. C4D R26 安装教程
  13. ASP.NET MVC+Vue.js实现联系人管理
  14. LeetCode.1046-最后的石头重量(Last Stone Weight)
  15. 同样取整,TRUNC函数与INT函数的有什么区别?
  16. 被哈佛录取后,他骑行4300公里旅行回家
  17. 华为手机比较好用的三款推荐
  18. Android N分屏(多窗口)适配
  19. Vue,js前端实现语音实时转换文字,前端实现浏览器语音实时转换为文字,vue阿里云语音转文字
  20. 数字图像处理——图像质量评价(Python)

热门文章

  1. 886 微型计算机原理,886微型计算机原理及应用.pdf
  2. 工业机器人工具中心点标定的意义_新品发布 | 倍加福新推VOS智能视觉传感器,为机器人添一双“慧眼”...
  3. html body 边框,html – 如何在表的tbody / thead部分创建边框?
  4. 新电脑怎么分盘_电脑新系统装了杀毒软件之后,原本非常流畅,怎么突然变卡了?...
  5. 说实话,这个发布会绝了!
  6. 同步逻辑电路和异步逻辑电路
  7. Linux命令中的参数,linux中一些命令以及一些参数的用法
  8. 安卓 sqlite数据存入mysql_在Android上简单导出和导入SQLite数据库
  9. java实现jsonscheme_java – jsonschema和日期类型
  10. 利用python 对比相似度_头条、油条商标有多像?Python检测发现相似度高达98.4%