Tom*_*rst 13 .net c# xml xmltextwriter control-characters
.NET XmlTextWriter
会创建无效的xml文件.
在XML中,允许一些控制字符,例如'horizontal tab'(	
),但其他控件字符不像'vertical tab'(
).(见规格)
我有一个字符串,其中包含XML中不允许的UTF-8控制字符.
虽然XmlTextWriter
逃避了角色,但最终的XML仍然是无效的.
如何确保XmlTextWriter
永远不会生成非法的XML文件?
或者,如果无法执行此操作XmlTextWriter
,如何从字符串中删除XML中不允许的特定控制字符?
示例代码:
using (XmlTextWriter writer =
new XmlTextWriter("test.xml", Encoding.UTF8))
{
writer.WriteStartDocument();
writer.WriteStartElement("Test");
writer.WriteValue("hello \xb world");
writer.WriteEndElement();
writer.WriteEndDocument();
}
Run Code Online (Sandbox Code Playgroud)
输出:
<?xml version="1.0" encoding="utf-8"?><Test>hello  world</Test>
Run Code Online (Sandbox Code Playgroud)
jas*_*sso 12
这种行为的文档隐藏在WriteString方法的文档中,但听起来它适用于整个类.
使用Create创建的XmlWriter的默认行为是在尝试写入0x-0x1F范围内的字符值时抛出ArgumentException(不包括空格字符0x9,0xA和0xD).可以通过在CheckCharacters属性设置为false的情况下创建XmlWriter来编写这些无效的XML字符.这样做会导致字符被数字字符实体(
�
通过�x1F
)替换.此外,默认情况下,使用new运算符创建的XmlTextWriter将使用数字字符实体替换无效字符.
因此,您似乎最终编写了无效字符,因为您正在使用XmlTextWriter类.更好的解决方案是使用XmlWriter类.
当我在解决同样的问题时刚刚发现这个问题,我最终用正则表达式解决了它:
return Regex.Replace(s, @"[\u0000-\u0008\u000B\u000C\u000E-\u001F]", "");
Run Code Online (Sandbox Code Playgroud)
希望它可以作为替代解决方案帮助某人。