XmlWriter只转义一种引用

时间:2009-03-04 19:33:38

标签: c# escaping xmlwriter

这是一些C#代码:

var sb = new StringBuilder();
var w = XmlWriter.Create(sb);
w.WriteStartElement("hello");
w.WriteAttributeString("target", "world ' \" !");
w.WriteEndElement();
w.Flush();
// then look at sb.ToString()

我收到的字符串如下:

 <?xml version="1.0" encoding="utf-16"?><hello target="world ' &quot; !" /> 

它只是逃避双引号,而不是单引号。但是XmlWriter.WriteAttributeString(String,String)的文档说:

  

如果属性值包含双引号或单引号,则它们是   替换为&amp; quot;和&amp;分别

我需要设置一些标志,以使其按照文档所说的那样做吗?

2 个答案:

答案 0 :(得分:7)

如果使用.Net Reflector查看代码,您会发现正在调用System.Xml.XmlTextEncoder.Write(string)方法。这是感兴趣的代码:

if (!this.inAttribute || (this.quoteChar != ch))
   this.textWriter.Write('\'');
else
   this.WriteEntityRefImpl("apos");

编写属性值时,单个引号不会被转义,因为它不需要。只有当写一个文本元素“&amp;”时才使用。

答案 1 :(得分:2)

这不是XmlWriter中的错误,这是旧系统中的错误。

如果你看一下XML 1.0建议中AttValue的定义,你会发现XmlWriter正在做的正是它应该做的事情:如果属性值是用撇号分隔的,属性值可以包含引号,如果用引号分隔,属性值可以包含撇号。

可以想象,您可以从XmlTextWriter派生一个类,并覆盖其WriteAttributesWriteAttributeString方法。那可能有用。但是,如果你这样做,请注意命名空间和编码。