【问题标题】:XmlWriter only escaping one kind of quoteXmlWriter 只转义一种引用
【发布时间】:2010-10-11 08:34:17
【问题描述】:

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

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

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

【问题讨论】:

  • 由于它们在语义上是相同的,你能解释一下为什么这会导致你出现问题吗?
  • 与旧系统的兼容性,遗憾的是。诚然,如果它和 .NET 的 XmlWriter 似乎没有重叠的错误,那将不是问题。 :P
  • 所以遗留系统无法理解有效的 XML。伊克。
  • shrug 而且 .NET 的 WriteAttributeString 甚至不遵守其文档字符串的第一句。如果我只想为我必须使用的糟糕系统推卸责任,我可以整天这样做。 :-)

标签: c# escaping xmlwriter


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 当官方文档说一个方法应该做某事而它没有做时,我称之为错误。 YMMV。 :-)
    • 当然,但这是文档中的错误。他们试图太乐于助人。文档应该注意的是特定于实现的行为,例如该方法转义的事实 > 即使 XML 建议不需要它。
    猜你喜欢
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 2013-01-28
    • 2021-04-25
    • 1970-01-01
    • 2017-12-25
    相关资源
    最近更新 更多