问题描述
问题:在使用XDocument向xml文件中写入rn等特殊字符时会出现这个错误:{"“.”(十六进制值0x00)是无效的字符。"}。查找资料,有人说用Base64进行转换,转换后写入没问题,但是在读取的时候中文字符全变成了乱码。请问:XDocument中有什么好的方法避免rn写入时出错的问题吗?
解决方案
解决方案二:
给你写一个例子usingSystem;usingSystem.IO;usingSystem.Xml.Linq;namespaceConsoleApplication1{classProgram{staticvoidMain(string[]args){varx=newXDocument();varr=newXElement("xml");x.Add(r);r.Add(newXElement("ToUserName","abcdrn1234"));r.Add(newXElement("FromUserName","defg"));r.Add(newXElement("Content",newXCData("目前还不能处理您的图片。rn怎么办?")));varstr=x.ToString();Console.WriteLine(str);Console.WriteLine();vary=XDocument.Load(newStringReader(str));Console.WriteLine("ToUserName={0}",y.Root.Element("ToUserName").Value);Console.WriteLine("按任意键结束.....");Console.ReadKey();}}}
你可以看到,内容中包含rn,根本用不着任何找麻烦的做法。
解决方案三:
引用楼主cabinriver的回复:
问题:在使用XDocument向xml文件中写入rn等特殊字符时会出现这个错误:{"“.”(十六进制值0x00)是无效的字符。"}。
这个说法非常可疑。编程如做人,要注意避免标题党。
解决方案四:
这种报错一般都是在开头或者结尾非xml节点错有特殊字符,而不是换行导致的
解决方案五:
引用2楼sp1234的回复:
Quote: 引用楼主cabinriver的回复:
问题:在使用XDocument向xml文件中写入rn等特殊字符时会出现这个错误:{"“.”(十六进制值0x00)是无效的字符。"}。这个说法非常可疑。编程如做人,要注意避免标题党。
我又测了一下,确实不是rn引起的,而是引起的。如下程序,会报刚才的错:varx=newXDocument();varr=newXElement("xml");x.Add(r);StringstrTest="";r.Add(newXElement("ToUserName",strTest));x.Save(fileName);
这种问题是不是要先对字符串进行处理,将转为别的字符进行存贮?有无特定的API呢?
解决方案六:
引用3楼starfd的回复:
这种报错一般都是在开头或者结尾非xml节点错有特殊字符,而不是换行导致的
是不是应该有专门处理此类特殊字符的函数
解决方案七:
楼主可能是在拼接XML吧,作为有规则的文本,特殊字符有它自己的编码方法,楼主试试写入双引号,尖括号也会有错误的.所以要用代码来生成,1楼写的是一种方法,还有用XmlTextWriter也可以.
解决方案八:
引用6楼tcmakebest的回复:
楼主可能是在拼接XML吧,作为有规则的文本,特殊字符有它自己的编码方法,楼主试试写入双引号,尖括号也会有错误的.所以要用代码来生成,1楼写的是一种方法,还有用XmlTextWriter也可以.
使用XData写入也不正确来着
解决方案九:
作为字符串结束符,不可能出现在正文中是不可见字符,即使出现在正文中,也是看不见的(没有实际意义)如果你是在想将二进制数据(比如图片、音乐)放进XML中,那么应做base64编码
解决方案十:
是什么理由要让你写入?。。。
解决方案十一:
使用XmlDocument可以写入,不过是经过转义的,xml文件里显示的是<testxmlns=""/>。LinQ的XDocument似乎无法进行转义,而是抛出异常。XmlDocumentxmlDoc=newXmlDocument();XmlElementxmlelem=xmlDoc.CreateElement("test","");xmlDoc.AppendChild(xmlelem);xmlDoc.Save("test.xml");
解决方案十二:
引用1楼sp1234的回复:
给你写一个例子usingSystem;usingSystem.IO;usingSystem.Xml.Linq;namespaceConsoleApplication1{classProgram{staticvoidMain(string[]args){varx=newXDocument();varr=newXElement("xml");x.Add(r);r.Add(newXElement("ToUserName","abcdrn1234"));r.Add(newXElement("FromUserName","defg"));r.Add(newXElement("Content",newXCData("目前还不能处理您的图片。rn怎么办?")));varstr=x.ToString();Console.WriteLine(str);Console.WriteLine();vary=XDocument.Load(newStringReader(str));Console.WriteLine("ToUserName={0}",y.Root.Element("ToUserName").Value);Console.WriteLine("按任意键结束.....");Console.ReadKey();}}}你可以看到,内容中包含rn,根本用不着任何找麻烦的做法。
存的是:"abcdrn1234"取到的是:"abcdn1234"缺了回车符。if((r.FirstNodeasXElement).Value==y.Root.Element("ToUserName").Value){Console.WriteLine("Same");}else{Console.WriteLine("Notsame");}