如何在C#中转义xml节点值中的引号
本文关键字:节点 转义 xml | 更新日期: 2023-09-27 18:20:22
我正在为一个旧应用程序生成xml文件。
它要求节点值中的引号("answers")必须转义
但是XmlWriter中的C#内部版本不能做到这一点,它不会转义节点值中的引号。
在将"
传递给节点之前,我尝试用"
替换它。InnerText。但写完之后,它变成了"
例如,我想要这种节点:
<node>text contains "</node>
但我要么得到了这个:
<node>text contains "</node>
或者这个:
<node>text contains &quot;</node>
如何转义xml节点值中的引号?
如果XML的使用者要求在XML文本中保留引号实体,那么它肯定是错误的。默认情况下,内置编写器会替换不必要的实体;但是,您可以通过实现自定义编写器来覆盖此行为:
public class PreserveQuotesXmlTextWriter : XmlTextWriter
{
private static readonly string[] quoteEntites = { "'", """ };
private static readonly char[] quotes = { '''', '"' };
private bool isInsideAttribute;
public PreserveQuotesXmlTextWriter(string filename) : base(filename, null)
{
}
public override void WriteStartAttribute(string prefix, string localName, string ns)
{
isInsideAttribute = true;
base.WriteStartAttribute(prefix, localName, ns);
}
private void WriteStringWithReplace(string text)
{
string[] textSegments = text.Split(quotes);
if (textSegments.Length > 1)
{
for (int pos = -1, i = 0; i < textSegments.Length; ++i)
{
base.WriteString(textSegments[i]);
pos += textSegments[i].Length + 1;
if (pos != text.Length)
base.WriteRaw(text[pos] == quotes[0] ? quoteEntites[0] : quoteEntites[1]);
}
}
else base.WriteString(text);
}
public override void WriteString(string text)
{
if (isInsideAttribute)
base.WriteString(text);
else
WriteStringWithReplace(text);
isInsideAttribute = false;
}
}