建在.NET逃生者,如SecurityElement.Escape
不正確逃脫/剝離它。
- 您可以設置
CheckCharacters
到false
的作家和讀者都如果你的應用是唯一一個與文件交互。儘管如此,生成的XML文件在技術上仍然是無效。
參見:
XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
xmlWriterSettings.Encoding = new UTF8Encoding(false);
xmlWriterSettings.CheckCharacters = false;
var sb = new StringBuilder();
var w = XmlWriter.Create(sb, xmlWriterSettings);
w.WriteStartDocument();
w.WriteStartElement("Test");
w.WriteString("hello \xb world");
w.WriteEndElement();
w.WriteEndDocument();
w.Close();
var xml = sb.ToString();
- 如果設置
CheckCharacters
到true
(這是默認設置)是有點過於嚴格,因爲它會簡單地拋出一個異常的替代方法,它更寬鬆無效的XML字符將只是去除他們:
谷歌搜索有點產生白名單XmlTextEncoder但是它也會刪除DEL
以及U + 007F-U + 0084,U + 0086-U + 009F範圍內的其他人,根據維基百科上的Valid XML Characters僅在特定上下文中有效,並且RFC提及爲鼓勵但仍然有效的字符。
public static class XmlTextExtentions
{
private static readonly Dictionary<char, string> textEntities = new Dictionary<char, string> {
{ '&', "&"}, { '<', "<" }, { '>', ">" },
{ '"', """ }, { '\'', "'" }
};
public static string ToValidXmlString(this string str)
{
var stripped = str
.Select((c,i) => new
{
c1 = c,
c2 = i + 1 < str.Length ? str[i+1]: default(char),
v = XmlConvert.IsXmlChar(c),
p = i + 1 < str.Length ? XmlConvert.IsXmlSurrogatePair(str[i + 1], c) : false,
pp = i > 0 ? XmlConvert.IsXmlSurrogatePair(c, str[i - 1]) : false
})
.Aggregate("", (s, c) => {
if (c.pp)
return s;
if (textEntities.ContainsKey(c.c1))
s += textEntities[c.c1];
else if (c.v)
s += c.c1.ToString();
else if (c.p)
s += c.c1.ToString() + c.c2.ToString();
return s;
});
return stripped;
}
}
這通過了所有測試XmlTextEncoder不同的是期望它剝去一個DEL
其中XmlConvert.IsXmlChar
,Wikipedia和規範標記爲有效的(雖然泄氣)字符。
你不能在XML中有一個轉義的垂直標籤?你能參考標準嗎? – Jodrell
@Jodrell沒錯,你做不到。 XML用於文本,不用於控制字符或二進制數據。 http://www.w3.org/TR/REC-xml/#charsets – jasso