XDocument向xml文件中写入\r \n等特殊字符的问题

cabinriver 2016-03-15 10:14:51
问题:
在使用XDocument向xml文件中写入\r \n等特殊字符时会出现这个错误:{"“.”(十六进制值 0x00)是无效的字符。"}。查找资料,有人说用Base64进行转换,转换后写入没问题,但是在读取的时候中文字符全变成了乱码。

请问:XDocument中有什么好的方法避免\r \n写入时出错的问题吗?
...全文
2673 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
给你写一个例子
using System;
using System.IO;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var x = new XDocument();
            var r = new XElement("xml");
            x.Add(r);
            r.Add(new XElement("ToUserName", "abcd\r\n1234"));
            r.Add(new XElement("FromUserName", "defg"));
            r.Add(new XElement("Content", new XCData("目前还不能处理您的图片。\r\n怎么办?")));
            var str = x.ToString();
            Console.WriteLine(str);
            Console.WriteLine();
            var y = XDocument.Load(new StringReader(str));
            Console.WriteLine("ToUserName = {0}", y.Root.Element("ToUserName").Value);
            Console.WriteLine("按任意键结束.....");
            Console.ReadKey();
        }
    }
}
你可以看到,内容中包含 \r \n,根本用不着任何找麻烦的做法。
存的是:"abcd\r\n1234" 取到的是:"abcd\n1234" 缺了回车符。
            if ((r.FirstNode as XElement).Value == y.Root.Element("ToUserName").Value)
            {
                Console.WriteLine("Same");
            }
            else
            {
                Console.WriteLine("Not same");
            }
tcmakebest 2016-03-15
  • 打赏
  • 举报
回复
楼主可能是在拼接XML吧,作为有规则的文本,特殊字符有它自己的编码方法,楼主试试写入双引号,尖括号也会有错误的. 所以要用代码来生成, 1楼写 的是一种方法, 还有用 XmlTextWriter 也可以.
cabinriver 2016-03-15
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
这种报错一般都是在开头或者结尾非xml节点错有特殊字符,而不是换行导致的
是不是应该有专门处理此类特殊字符的函数
cabinriver 2016-03-15
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
[quote=引用 楼主 cabinriver 的回复:] 问题: 在使用XDocument向xml文件中写入\r \n等特殊字符时会出现这个错误:{"“.”(十六进制值 0x00)是无效的字符。"}。
这个说法非常可疑。编程如做人,要注意避免标题党。[/quote] 我又测了一下,确实不是\r \n引起的,而是\0引起的。如下程序,会报刚才的错:

            var x = new XDocument();
            var r = new XElement("xml");
            x.Add(r);
            String strTest = "\0";
            r.Add(new XElement("ToUserName", strTest));
            x.Save(fileName);
这种问题是不是要先对字符串进行处理,将\0转为别的字符进行存贮?有无特定的API呢?
  • 打赏
  • 举报
回复
这种报错一般都是在开头或者结尾非xml节点错有特殊字符,而不是换行导致的
  • 打赏
  • 举报
回复
引用 楼主 cabinriver 的回复:
问题: 在使用XDocument向xml文件中写入\r \n等特殊字符时会出现这个错误:{"“.”(十六进制值 0x00)是无效的字符。"}。
这个说法非常可疑。编程如做人,要注意避免标题党。
  • 打赏
  • 举报
回复
给你写一个例子
using System;
using System.IO;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var x = new XDocument();
            var r = new XElement("xml");
            x.Add(r);
            r.Add(new XElement("ToUserName", "abcd\r\n1234"));
            r.Add(new XElement("FromUserName", "defg"));
            r.Add(new XElement("Content", new XCData("目前还不能处理您的图片。\r\n怎么办?")));
            var str = x.ToString();
            Console.WriteLine(str);
            Console.WriteLine();
            var y = XDocument.Load(new StringReader(str));
            Console.WriteLine("ToUserName = {0}", y.Root.Element("ToUserName").Value);
            Console.WriteLine("按任意键结束.....");
            Console.ReadKey();
        }
    }
}
你可以看到,内容中包含 \r \n,根本用不着任何找麻烦的做法。
cabinriver 2016-03-15
  • 打赏
  • 举报
回复
使用XmlDocument可以写入\0,不过是经过转义的,xml文件里显示的是<test xmlns="" />。LinQ的XDocument似乎无法进行转义,而是抛出异常。

            XmlDocument xmlDoc = new XmlDocument();

            XmlElement xmlelem = xmlDoc.CreateElement("test","\0");
            xmlDoc.AppendChild(xmlelem);
            xmlDoc.Save("test.xml"); 
crystal_lz 2016-03-15
  • 打赏
  • 举报
回复
是什么理由要让你写入 \0 ?。。。
xuzuning 2016-03-15
  • 打赏
  • 举报
回复
\0 作为字符串结束符,不可能出现在正文中 \0 是不可见字符,即使出现在正文中,也是看不见的(没有实际意义) 如果你是在想将二进制数据(比如图片、音乐)放进 XML 中,那么应做 base64 编码
cabinriver 2016-03-15
  • 打赏
  • 举报
回复
引用 6 楼 tcmakebest 的回复:
楼主可能是在拼接XML吧,作为有规则的文本,特殊字符有它自己的编码方法,楼主试试写入双引号,尖括号也会有错误的. 所以要用代码来生成, 1楼写 的是一种方法, 还有用 XmlTextWriter 也可以.
使用XData写入\0也不正确来着

111,113

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧