当前位置:  编程技术>.net/c#/asp.net

c#中XML解析文件出错解决方法

    来源: 互联网  发布时间:2014-11-02

    本文导语:  1.内容中含有xml预定好的实体,如“XML CDATA是什么?》。 2.内容中含有低位非打印字符,解析时会报错:""(十六进制值 0x1D)是无效的字符.加载或保存XML时引发的异常.System.ArgumentException: “”(十六进制值 0x1D)是无效的字符。 出...

1.内容中含有xml预定好的实体,如“XML CDATA是什么?》。

2.内容中含有低位非打印字符,解析时会报错:""(十六进制值 0x1D)是无效的字符.加载或保存XML时引发的异常.System.ArgumentException: “”(十六进制值 0x1D)是无效的字符。

出错的原因是内容中含有低位非打印字符,处理方法是对其进行过滤,过滤方法为:

return System.Text.RegularExpressions.Regex.Replace(str,@"[x00-x08]|[x0B-x0C]|[x0E-x1F]";

以上两种情况,第一种较为普遍,第二种遇到情况比较少,在面对一些用户输入数据时生成xml,可以对xml结点内容执行上述过滤,以保证xml文件使用者可以正确解析xml文档。

以下是详细解释:

“”(十六进制值 0x1D)是无效的字符

加载或保存XML时引发的异常.System.ArgumentException: “”(十六进制值 0x1D)是无效的字符。
产生原因是xml文件中包含低位非打印字符造成的
处理方法:在产生xml文件的时候,过滤低位非打印字符

把一个字符串中的 低序位 ASCII 字符 替换成 字符
转换 ASCII 0 - 8 -> -
转换 ASCII 11 - 12 -> -
转换 ASCII 14 - 31 -> -


简单的处理方法
return System.Text.RegularExpressions.Regex.Replace(HttpUtility.HtmlEncode(str),@"[x00-x08]|[x0B-x0C]|[x0E-x1F]", "");

======================================================================================================================================================

复杂处理

获取xml时,出现“(十六进制值 0x1F)是无效的字符之类Xml异常的解决办法2008-12-19 10:44最近做新闻采集器,需要获取很多站点的xml,加载个别站点经常出现“(十六进制值 0x1F)是无效的字符”问题,百思不的其解。对于问题站点xml的处理,开始的思路是既然直接用 XmlDocument对象的Load()方法不行,就用LoadXML() ,用HttpWebRequest 获取url读到流里再转为xml,中间可以加一些非有效字符的过滤处理,但仍然无效,仅仅解决了请求超时的问题...

问题搁置了1周后,终于在今天解决了。

其实很简单,只加一条语句就搞定了

XmlDocument doc = new XmlDocument();

doc.Normalize();

         // 摘要:
        //     将此 XmlNode 下子树完全深度中的所有 XmlText 节点都转换成“正常”形式,在这种形式中只有标记(即标记、注释、处理指令、CDATA
        //     节和实体引用)分隔 XmlText 节点,也就是说,没有相邻的 XmlText 节点。

以下是转一位仁兄的贴:

最近碰到一个问题,我的一个把数据库中记录的信息暴露出来的Web Service调用时候出问题了。报下面的错误信息:

System.InvalidOperationException was unhandled
Message="XML 文档(1, 823)中有错误。"
Source="System.Xml"
 Message="“”(十六进制值 0x0E)是无效的字符。 行 1,位置 823。"
 Source="System.Xml"

当这个错误发生时,Web Service 服务器端不会有任何错误,而调用这个 Web Service 的客户端则会报上述错误。
是何原因导致的这个问题呢?
答案很简单,是WEB Service 暴露的XML文档中存在低序位非打印 ASCII 字符所致。
我们查看 Web Service 返回的XML 文档文档中,会有下面的XML文档节:其中的 就是低序位 ASCII 字符。 对应的字符如后:

在神奇天地裏誰叱咤風雨

会导致这些问题的 低序位非打印 ASCII 字符包含以下字符:
#x0 - #x8 (ASCII 0 - 8)
#xB - #xC (ASCII 11 - 12)
#xE - #x1F (ASCII 14 - 31)

下面就是一个简单演示这个问题的控制台程序,
为了简单起见,这里没有建立 WebService, 而是把一个类XML序列化存储到文件,然后再把这个文件反序列化读取出来:
其中的这个类的Value值中,放了一个低序位非打印 ASCII 字符。
执行这个控制台程序,就会报异常。“XML 文档(3, 12)中有错误。”

using System;
using System.Xml.Serialization;
using System.IO;
using System.Text;
using System.Globalization;
namespace TextSerialize
{
[Serializable]
public class MyClass
{
public string Value { get; set; }
}
class Program
{
static void Main(string[] args)
{
string fileName = "d:\1.txt";
MyClass c = new MyClass();
c.Value = string.Format("在神奇{0}天地裏誰叱咤風雨", Convert.ToChar(14));
SaveAsXML(c, fileName, Encoding.UTF8);
object o = ConvertFileToObject(fileName, typeof(MyClass), Encoding.UTF8);
MyClass d = o as MyClass;
if (d != null) Console.WriteLine(d.Value);
else Console.WriteLine("null");
Console.ReadLine();
}
/// 
/// 序列化
/// 
/// 
/// 
/// 
public static void SaveAsXML(object objectToConvert, string path, Encoding encoding)
{
if (objectToConvert != null)
{
Type t = objectToConvert.GetType();
XmlSerializer ser = new XmlSerializer(t);
using (StreamWriter writer = new StreamWriter(path, false, encoding))
{
ser.Serialize(writer, objectToConvert);
writer.Close();
}
}
}
/// 
/// 反序列化
/// 
/// 
/// 
/// 
/// 
public static object ConvertFileToObject(string path, Type objectType, Encoding encoding)
{
object convertedObject = null;
if (!string.IsNullOrEmpty(path))
{
XmlSerializer ser = new XmlSerializer(objectType);
using (StreamReader reader = new StreamReader(path, encoding))
{
convertedObject = ser.Deserialize(reader);
reader.Close();
}
}
return convertedObject;
}
}
}

上面提到的Web Service 的那个问题,跟这个演示程序是一样的。

我们需要被序列化的内容中,存在 低序位非打印 ASCII 字符 时, .net 会给我们正常序列化, 会自动把 低序位非打印 ASCII 字符 转换成 编码的字符(这个XML规范中要求这么做的)。

但是,反序列化时候,如果需要反序列化的内容如果存在 编码的字符(映射到低序位非打印 ASCII 字符),则反序列化就会出错。


如果解决这个问题呢?

当然,最彻底的解决方法是修改反序列化的代码,让这些字符不会出错。但这个东西很多时候不归我们控制。这个方案不可行。

下一个方案就是剔除这些捣乱的字符。

我这里要给出的方案,是对这些字符序列化时作一次预处理,反序列化时,作一次反向处理。
这里为了演示的更有意义,我这里处理逻辑就是把 低序位非打印 ASCII 字符 转换成 编码的字符 ,和把 编码的字符 转换成 低序位非打印 ASCII 字符。
这样就可以使用我这里提供的函数,实现更多的处理逻辑。这两个函数的代码如下:

       

/// 
/// 把一个字符串中的 低序位 ASCII 字符 替换成  字符
/// 转换 ASCII 0 - 8 ->  - 
/// 转换 ASCII 11 - 12 ->  - 
/// 转换 ASCII 14 - 31 ->  - 
/// 
/// 
/// 
public static string ReplaceLowOrderASCIICharacters(string tmp)
{
StringBuilder info = new StringBuilder();
foreach (char cc in tmp)
{
int ss = (int)cc;
if (((ss >= 0) && (ss = 11) && (ss = 14) && (ss  ASCII 0 - 8
/// 转换  -  -> ASCII 11 - 12
/// 转换  -  -> ASCII 14 - 31
/// 
/// 
/// 
public static string GetLowOrderASCIICharacters(string input)
{
if (string.IsNullOrEmpty(input)) return string.Empty;
int pos, startIndex = 0, len = input.Length;
if (len = 0)
{
bool needReplace = false;
string rOldV = string.Empty, rNewV = string.Empty;
int le = (len - pos < 6) ? len - pos : 6;
int p = input.IndexOf(";", pos, le);
if (p >= 0)
{
rOldV = input.Substring(pos, p - pos + 1);
// 计算 对应的低位字符
short ss;
if (short.TryParse(rOldV.Substring(3, p - pos - 3), NumberStyles.AllowHexSpecifier, null, out ss))
{
if (((ss >= 0) && (ss = 11) && (ss = 14) && (ss 

    
 
 

您可能感兴趣的文章:

  • 操作xml,将xml数据显示到treeview的C#代码
  • C#读写xml文件的简单例子
  • 深入C#中使用SqlDbType.Xml类型参数的使用详解
  • c# xml API操作的小例子
  • 操作XML文档遇到的XMLNS问题及解决方法 (C# 和 PHP)
  • c#使用linq技术创建xml文件的小例子
  • C#读写xml配置文件(LINQ操作实例)
  • c# 读取XML文件的简单代码
  • C# 写入XML文档的三种方法与代码实例
  • c#中xml文档注释编译dll引用到其它项目示例
  • C# Linq读取XML文件的实例
  • C# WinForm开发中使用XML配置文件实例
  • c# DataSet转为XML时格式化字段数据的方法
  • C# DataSet的内容写成XML时如何格式化字段数据
  • c# 读取xml 冒号问题的解决方法
  • c#读取xml文件到datagridview实例
  • C# XML与Json之间相互转换实例详解
  • C#序列化成XML注意细节
  • C# 写入XML文档三种方法详细介绍
  • C#通过XML节点属性/属性值读取写入XML操作代码实例
  • 请使用过ANT的兄弟帮偶看看在编build.xml时出的这个出错信息!
  • jsp,servelt出错了,NoClassDefFoundError: javax/xml/parsers/DocumentBuilderFactory
  • linux下用libxml2解析包含中文数据的xml时出错
  • JavaScript的XML解析包 xml2array() iis7站长之家
  • 我的xml.jsp在tomcat里运行出错,帮忙看看!!!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • 请问各位:我用SUN公司的JAXP开发包解析XML文档,可不知道对XML解析后如何将结果写回文件中。请各位熟悉Java和XML的高手帮忙。
  • 基于Python的Html/xml解析库Beautiful Soup 4.2.1发布
  • 请问怎样手工的解析XML文件啊.( 不借助任何的xml解析器)急!!!
  • Python下Html/xml解析库Beautiful Soup快速入门教程
  • XML解析器 Mini-XML
  • python下xml解析库lxml最新版下载安装以及代码示例
  • java解析xml之jdom解析xml示例分享
  • python对XML的解析方法(SAX,DOM,ElementTree)介绍
  • XML解析器 Expat XML Parser
  • 关于xml解析速度问题!用森么解析xml最快!xml为小文件!附源程序(JDOM)
  • java解析xml之dom解析xml示例分享
  • JavaScript的XML解析包 xml2array()
  • Java的XML解析器 xml-utilities
  • java解析xml之dom4j解析xml示例分享
  • 在眾多的java xml parser中,那種解析器速度最快(xml 文件較大)
  • 如何边下载XML文件并对其进行解析呢?
  • SAX模式的XML解析器 fasterxml
  • xml用什么来解析,用的是什么包?
  • jquery解析XML字符串和XML文件的方法说明
  • java解析xml用什么包?
  • java命名空间javax.xml类xmlconstants的类成员方法: xml_ns_prefix定义及介绍
  • 如何新建立一个XML文件并且把别的XML文件引入到这个XML文件中(再线等待)
  • java命名空间javax.xml类xmlconstants的类成员方法: xml_ns_uri定义及介绍
  • 看了半本,是关于java与xml编程的书,它用xml来代替数据库,试问,xml真的能开题数据库吗?(在性能方面)
  • java命名空间javax.xml.transform类outputkeys成员方法: omit_xml_declaration定义参考
  • XML 能够 include吗?如何拆分很长的XML
  • java命名空间javax.xml类xmlconstants的类成员方法: xml_dtd_ns_uri定义及介绍
  • Java 和XML 编程时,XML的DTD 放到哪?
  • java命名空间javax.xml类xmlconstants的类成员方法: w3c_xml_schema_ns_uri定义及介绍
  • javax.xml中用什么方法和对象来接收request中的xml文档,急!




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3