XmlTextWriter错误地编写控制字符

Tom*_*rst 13 .net c# xml xmltextwriter control-characters

.NET XmlTextWriter会创建无效的xml文件.

在XML中,允许一些控制字符,例如'horizo​​ntal 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 &#xB; world</Test>
Run Code Online (Sandbox Code Playgroud)

jas*_*sso 12

这种行为的文档隐藏在WriteString方法文档中,但听起来它适用于整个类.

使用Create创建的XmlWriter的默认行为是在尝试写入0x-0x1F范围内的字符值时抛出ArgumentException(不包括空格字符0x9,0xA和0xD).可以通过在CheckCharacters属性设置为false的情况下创建XmlWriter来编写这些无效的XML字符.这样做会导致字符被数字字符实体(&#0; 通过&#0x1F)替换.此外,默认情况下,使用new运算符创建的XmlTextWriter将使用数字字符实体替换无效字符.

因此,您似乎最终编写了无效字符,因为您正在使用XmlTextWriter类.更好的解决方案是使用XmlWriter类.


roc*_*cco 6

当我在解决同样的问题时刚刚发现这个问题,我最终用正则表达式解决了它:

return Regex.Replace(s, @"[\u0000-\u0008\u000B\u000C\u000E-\u001F]", "");
Run Code Online (Sandbox Code Playgroud)

希望它可以作为替代解决方案帮助某人。