我正在使用一些包含字符串的XML:

<node>This is a string</node>

我传递给节点的一些字符串将有&,#,$等字符:

<node>This is a string & so is this</node>

由于&,这是无效的。

我不能在CDATA中包装这些字符串,因为它们需要这样。我尝试寻找一个字符列表,这些字符不能放在XML节点中,而不能放在CDATA中。

有人能给我指个方向或者给我一份非法字符的列表吗?


当前回答

对于Java人来说,Apache有一个实用程序类(StringEscapeUtils),它有一个帮助方法escapeXml,可以用来使用XML实体转义字符串中的字符。

其他回答

唯一的非法字符是&,<和>(以及属性中的"或',这取决于使用哪个字符来分隔属性值:attr="必须使用"这里,' is allowed '和attr='必须使用&apos;在这里,“is allowed”)。

它们是用XML实体转义的,这里你需要&&。

实际上,您应该使用一个工具或库来为您编写XML,并为您抽象这类东西,这样您就不必担心了。

这是一个c#代码,用于从字符串中删除XML无效字符并返回一个新的有效字符串。

public static string CleanInvalidXmlChars(string text) 
{ 
    // From xml spec valid chars: 
    // #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]     
    // any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. 
    string re = @"[^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD\u10000-\u10FFFF]"; 
    return Regex.Replace(text, re, ""); 
}

预先声明的字符是:

& < > " '

有关更多信息,请参阅“XML中的特殊字符是什么?”

对于XSL(在非常懒惰的日子里),我使用:

capture="&amp;(?!amp;)" capturereplace="&amp;amp;"

翻译所有没有遵循的&符号på amp;敬合适的人。

在某些情况下,输入是CDATA,但是使用XML的系统没有考虑到它。这是一个草率的修复,小心…

在c#中删除不正确的XML字符的另一种方法是使用XmlConvert。IsXmlChar (.NET Framework 4.0后可用)

public static string RemoveInvalidXmlChars(string content)
{
   return new string(content.Where(ch => System.Xml.XmlConvert.IsXmlChar(ch)).ToArray());
}

或者你可以检查所有字符都是xml有效的:

public static bool CheckValidXmlChars(string content)
{
   return content.All(ch => System.Xml.XmlConvert.IsXmlChar(ch));
}

net小提琴

例如,垂直制表符(\v)对于XML无效,它是有效的UTF-8,但不是有效的XML 1.0,甚至许多库(包括libxml2)都会遗漏它并无声地输出无效的XML。