有人说,xml是水,是空气,程序员当然也离不开水和空气。
请看下面的一个例子:
------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<article>
<author>张三</author>
<body><![CDATA[李四€]]></body>
</article>
------------------------------------------------
死活报错(包含有十六进制字符)。有人说用body Base64加密,这样每次加载时还要解密。
从性能的角度,这样值吗?从google中搜了n条,没有找到答案。

解决方案 »

  1.   

    一般xml都不加密吧,如果你要加密,用个access数据存不是更好
    如果少量信息,自己加密后保存成文件也可以的啊
      

  2.   

    我也不倾向加密,但是如何解决十六进制字符导成的"无效字符"的问题?先Load,如果失败,再去读IO,把xml文件中的无效字符替换掉,再把xml Load进来?
      

  3.   

    <![CDATA[李四€]]> 这样的字符在xml中是不支持的.
      

  4.   

    对XML了解的不太深入
    帮UP~~
      

  5.   

    €是一些特殊的字符,因为网友在发贴子时,可能会出现这些字,只要出现了这些字,加载xml时就会出现无效字符,导致加载失败.
      

  6.   

    .net XML 还是非常强大的LZ的方法不对..XmlDocument xmlDocument = new XmlDocument();
                xmlDocument.LoadXml("<?xml   version= \"1.0\"   encoding= \"UTF-8\"?> <article></article>");
                XmlNode node = xmlDocument.SelectSingleNode("descendant::article");
                XmlElement temp = xmlDocument.CreateElement("author");
                XmlText temptext = xmlDocument.CreateTextNode("张三");
                temp.AppendChild(temptext);
                node.AppendChild(temp);            temp = xmlDocument.CreateElement("body");
                temptext = xmlDocument.CreateTextNode("李四€");
                temp.AppendChild(temptext);
                node.AppendChild(temp);RETURN  <?xml version="1.0" encoding="UTF-8" ?> 
    <article>
      <author>张三</author> 
      <body>李四€</body> 
      </article>
      

  7.   


    XmlDocument xmlDocument = new XmlDocument();
                xmlDocument.LoadXml("<?xml   version= \"1.0\"   encoding= \"UTF-8\"?> <article></article>");
                XmlNode node = xmlDocument.SelectSingleNode("descendant::article");
                XmlElement temp = xmlDocument.CreateElement("author");
                XmlText temptext = xmlDocument.CreateTextNode("张三");
                temp.AppendChild(temptext);
                node.AppendChild(temp);            temp = xmlDocument.CreateElement("body");
                temptext = xmlDocument.CreateTextNode("<![CDATA[李四€]]>");
                temp.AppendChild(temptext);
                node.AppendChild(temp);RETURN
    string:<?xml version="1.0" encoding="UTF-8"?><article><author>张三</author><body>&lt;![CDATA[李四&#x13;€&#x2;]]&gt;</body></article><?xml version="1.0" encoding="UTF-8"?><article><author>张三</author><body>&lt;![CDATA[李四&#x13;€&#x2;]]&gt;</body></article>
      

  8.   

    xml应该是这个  <?xml version="1.0" encoding="UTF-8" ?> 
     <article>
      <author>张三</author> 
      <body><![CDATA[李四€]]></body> 
      </article>
      

  9.   

    谢谢大家的回答,这些数据是直接从数据库中调出来,然后生成xml,下次再读时就不用从数据库读了,直接LoadXml就行了。关键是LoadXml不成功,报无效字符的错误,是因为十六进制字符的原因。我也看过用xml作为数据库,直接做留言版的例子,直接LoadXml,没有考虑到十六进制字符的情况。
      

  10.   

    €不属于UTF-8的字符集,考虑用iso8859-1
      

  11.   

    数据库存的是<?xml version="1.0" encoding="UTF-8" ?> 
     <article>
      <author>张三</author> 
      <body><![CDATA[李四€]]></body> 
      </article>还是张三?
    要是张三可以用我的方法Load要是XML请用我的方法LOAD完存入数据库..
      

  12.   

    我是分几列存到数据库的,这样以后变结构容易,以前csdn也有这样的毛病,现在没有了,不知现在csdn是怎么弄的?
    谢谢大家的回答。
      

  13.   

    确定xml是以utf8编码保存成文件的吗?
      

  14.   

    XML对于这些非法字符的确是很麻烦 特别是 & 建议不要在 XML 中出现这些词 或者特殊处理一下(用其它词替换)
      

  15.   

    utf-8只支持ASCII码里的字符,当然显示不了
      

  16.   

    当然确定xml是以utf8编码保存成文件的,utf-8不支持ASCII码里的字符,所以显示不了。
    如果要支持ASCII码里的字符,不知有没有比较好的解决方案?
      

  17.   

    ------------------------------------------------ <?xml   version= "1.0 "   encoding= "UTF-8 "?> 
    <article> 
    <author> 张三 </author> 
    <body> <![CDATA[李四€]]> </body> 
    </article> 
    -----------------------------------------------
    报错就对了,不报错那就麻烦了,8位二进制不可以表示汉字的,那必须用16位的
    如下<?xml   version= "1.0 "   encoding= "utf-16"?> 
    <article> 
    <author> 张三 </author> 
    <body> <![CDATA[李四€]]> </body> 
    </article>
      

  18.   

    存成utf-16格式后XmlDocument document = new XmlDocument();
    document.Load("test.xml");还是报"无效字符"的错误,这可能是xmlDocument不支持ASCII的原因。
    看来不能用XmlDocument
      

  19.   

    <?xml version="1.0" encoding= "gb2312"?> 
    <article> 
    <author> 张三 </author> 
    <body> <![CDATA[李四€]]> </body> 
    </article>执行通过
      

  20.   

    是处理上的问题,不关人家xml的事
    那你说人家xml是怎么存图片,怎么存音乐的?base64
      

  21.   

    注意 
    CDATA 节中的内容必须在 XML 内容允许的字符范围内;控制字符和兼容性字符不能通过这种方式转义。
     
    这是MSDN上的说明。所以lz为什么一定要在CData里写这些字符呢?在普通节点里写是没有问题的。
      

  22.   

    问题解决,还是原先的思路,如有更好的想法请回复,过两天结贴.<?xml version= "1.0" encoding= "UTF-8"?> 
    <article> 
    <author> 张三 </author> 
    <body> <![CDATA[李四€]]> </body> 
    </article> private string ConvertHex(string responseXml)
        {
            UTF8Encoding encoding = new UTF8Encoding();
            Byte[] responseByteArr = encoding.GetBytes(responseXml);
            for (int i = 0; i < responseByteArr.Length; i++)
            {
                if (responseByteArr[i] < 32)
                {
                    responseByteArr[i] = 32;
                }
            }
            return encoding.GetString(responseByteArr);
        }    protected void Page_Load(object sender, EventArgs e)
        {
            string FileName = @"D:\Solution\test-utf8.xml";
            string xmlstr = "";
            string[] s = null;
            StringBuilder temp = new StringBuilder();
            XmlDocument doc = new XmlDocument();
            try{//直接加载xml
                doc.Load(FileName);
            }catch{//xml可能有十六进制字符,过滤掉这些这符再加载xml字符串
                s = File.ReadAllLines(FileName);
                for (int i = 0; i < s.Length; i++)
                {
                    temp.Append(s[i]);
                }
                xmlstr = ConvertHex(temp.ToString());
                doc.LoadXml(xmlstr);//重新加载LoadXml not Load
            }finally { 
            
            }
            XmlNodeReader reader = new XmlNodeReader(doc);
            Response.Write("作者:");
            Response.Write(doc.SelectSingleNode("/article/author").InnerText);
            Response.Write("<br><br><br>正文:<br>");
            Response.Write(doc.SelectSingleNode("/article/body").InnerText);
        }
      

  23.   

    以前是直接存到数据库的,后来因为负载的问题,想改成基于xml的,欢迎大家继续提建议.
      

  24.   

    utf-8只支持ASCII码里的字符,当然显示不了