1

这是一些 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) 的文档说:

如果属性值包含双引号或单引号,则将它们替换为 " 和’ 分别。

是否需要设置一些标志以使其执行文档所说的操作?

4

2 回答 2

7

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

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

写入属性值时,不会转义单引号,因为它不需要。只有在编写文本元素时“&’” 用来。

于 2009-03-04T19:45:20.933 回答
2

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

如果您查看AttValueXML 1.0 推荐中的定义,您会发现它XmlWriter正在做它应该做的事情:如果属性值用撇号分隔,则属性值可以包含引号,如果它被分隔带引号的属性值可以包含撇号。

可以想象,您可以从中派生一个类XmlTextWriter并覆盖它的WriteAttributesWriteAttributeString方法。那可能行得通。但是,如果您这样做,请注意名称空间和编码。

于 2009-03-04T20:25:36.657 回答