字符串转义为XML-Attribute

我看了一下XML转义字符串 ,发现它非常有用。

我想做类似的事情:转义要在XML-Attribute中使用的字符串。

该字符串可能包含\ r \ n。 XmlWriter类产生类似\ r \ n – >


我目前使用的解决方案包括XmlWriter和StringBuilder,而且非常难看。

任何提示?

EDIT1:
抱歉让LarsH失望,买我的第一个方法是

public static string XmlEscapeAttribute(string unescaped) { XmlDocument doc = new XmlDocument(); XmlAttribute attr= doc.CreateAttribute("attr"); attr.InnerText = unescaped; return attr.InnerXml; } 

这是行不通的。 XmlEscapeAttribute("Foo\r\nBar")将导致"Foo\r\nBar"

我使用.NET Reflector来了解XmlTextWriter如何转义属性。 它使用内部的XmlTextEncoder类…

我的方法我目前正在使用这样的方法:

 public static string XmlEscapeAttribute(string unescaped) { if (String.IsNullOrEmpty(unescaped)) return unescaped; XmlWriterSettings settings = new XmlWriterSettings(); settings.OmitXmlDeclaration = true; StringBuilder sb = new StringBuilder(); XmlWriter writer = XmlWriter.Create(sb, settings); writer.WriteStartElement("a"); writer.WriteAttributeString("a", unescaped); writer.WriteEndElement(); writer.Flush(); sb.Length -= "\" />".Length; sb.Remove(0, "<aa=\"".Length); return sb.ToString(); } 

它很丑陋,可能很慢,但它确实有效: XmlEscapeAttribute("Foo\r\nBar")将导致"Foo Bar"

EDIT2:

 SecurityElement.Escape(unescaped); 

也不起作用。

Edit3(最后):

使用Lars的所有非常有用的注释,我的最终实现如下所示:

注意.Replace("\r", " ").Replace("\n", " "); 有效的XMl不需要。 这只是一种美容措施!

  public static string XmlEscapeAttribute(string unescaped) { XmlDocument doc = new XmlDocument(); XmlAttribute attr= doc.CreateAttribute("attr"); attr.InnerText = unescaped; // The Replace is *not* required! return attr.InnerXml.Replace("\r", "
").Replace("\n", "
"); } 

事实certificate这是有效的XML,并且将由任何符合标准的XMl-parser解析:

  

修改你引用的解决方案,怎么样

 public static string XmlEscape(string unescaped) { XmlDocument doc = new XmlDocument(); var node = doc.CreateAttribute("foo"); node.InnerText = unescaped; return node.InnerXml; } 

我所做的只是将CreateElement()更改为CreateAttribute()。 属性节点类型确实具有InnerText和InnerXml属性。

我没有环境来测试这个,但我很想知道它是否有效。

更新:或者更简单地说,使用SecurityElement.Escape()按照您链接到的问题的另一个答案中的建议。 这将转义引号,因此适合用于属性文本。

更新2:请注意不需要在属性值中转义回车符和换行符,以使XML格式正确。 如果由于其他原因希望对它们进行转义,可以使用String.replace()进行转义,例如

 SecurityElement.Escape(unescaped).Replace("\r", "
").Replace("\n", "
"); 

要么

 return node.InnerXml.Replace("\r", "
").Replace("\n", "
"); 

如果它可以提供任何帮助,使用多种语言,可以使用createCDATASection来避免所有XML特殊字符。

它增加了这样的东西:

  ]]>