String.Replace似乎没有替换Hex char

时间:2012-03-30 20:21:07

标签: c# .net xml linq-to-xml

我有一个用XML属性修饰的类,例如[XmlAttribute(“att”)]。我的目标是使用此类的xml创建一个XDocument。一切都很好,除了偶尔从外部进入场景的'0x1f'字符。所以我自然会尝试更换它:

XmlSerializer serializer = new XmlSerializer(this.GetType());
StringWriter sw = new StringWriter();
serializer.Serialize(sw, this);
string s = sw.ToString();
s = s.Replace((char)0x1F, ' ');
XDocument xs = XDocument.Parse(s);
return xs;

但是我仍然收到错误:“'',十六进制值0x1F,是一个无效字符。”

只是为了进行健全性检查,这是一个截图: http://i.imgur.com/jZRWg.png

我可能出错的任何想法?

3 个答案:

答案 0 :(得分:2)

如果它被表示为一个实体,你会得到相同的答案 - 也许这就是发生了什么?请看s以确定。

样品:

using System;
using System.Xml.Linq;

class Test
{
    static void Main()
    {
        string xml = "<foo>&#31;</foo>";
        XDocument.Parse(xml);
    }
}

答案 1 :(得分:2)

字符x1F在XML 1.0中不合法。所以XML解析器会拒绝它。它在XML 1.1中是合法的,只要它是以转义形式&#x1f;编写的 - 但不是每个人都支持XML 1.1。最好的办法是弄清楚这个角色进入系统的位置,并在源头阻止它发生。

答案 2 :(得分:1)

对我而言,如果您尝试使用字符串而不是char替换,则会出现一些问题。我建议使用两者来尝试一些测试值,看看它们出现了什么。另外你如何引用它有一定的效果。

var a = x.IndexOf('\u001f');                      // 513
var b = x.IndexOf(Convert.ToString((byte)0x1F));  // -1
x = x.Replace(Convert.ToChar((byte)0x1F), ' ');   // Works
x = x.Replace(Convert.ToString((byte)0x1F), " "); // Fails

I blagged this