停止unescaping“

时间:2015-08-24 08:07:34

标签: c# xml

我在阅读XML文件并向其添加节点时遇到问题。好吧不完全..添加节点工作正常,但源XML文件包含一些包含"

的行

保存我的xmlDocument后,这些"部分转换为"

如何阻止c#将"转换为",因为加载xml文件的应用程序需要"个标记

示例行:

<item name="Description">DBName "xyz"</item>

3 个答案:

答案 0 :(得分:0)

您不需要在元素中编码引号,仅在属性中编码。所以:

<item name="Description">DBName &quot;xyz&quot;</item>

是不必要的,你可以使用:

<item name="Description">DBName "xyz"</item>

似乎XmlDocument.Load()理解你在一个元素中不必要地放置编码引号(&amp; quot;)时的意思,默认情况下XmDocument.Save()用未编码的引号(“)替换它们。” / p>

如果您的来源是:

,您会注意到完全相同的行为
<item name="Description">DBName &#34;xyz&#34;</item>

其中“是”

的XML字符引用

https://stackoverflow.com/a/150441/283787解释说:“不是必须在元素数据中编码的字符。

如果要预设空格,只需添加以下代码行:

doc.PreserveWhitespace = true;

答案 1 :(得分:0)

如果需要在XML文本中保留引用实体,那么XML的使用者肯定是错误的。默认情况下,内置编写器替换不必要的实体;但是,您可以通过实现自定义编写器来覆盖此行为:

public class PreserveQuotesXmlTextWriter : XmlTextWriter
{
    private static readonly string[] quoteEntites = { "&apos;", "&quot;" };
    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;
    }
}

您甚至可以从XmlDocument实例使用它:

    XmlDocument xml = new XmlDocument();
    xml.Load(filename);
    // ...
    XmlWriter writer = new PreserveQuotesXmlTextWriter(filename);
    xml.Save(writer);

答案 2 :(得分:0)

谢谢你们,我真的不需要逃避这些报价。问题是document.save改变了xml输出,因此目标应用程序无法正确读取xml。

示例:

<profile> <list name=""> <item name="FileVersion">0.88</item> <item name="ID">xyz</item>

变成

<profile> <list name=""> <item name="FileVersion">0.88</item> <item name="ID">xyz</item>

节点前有更多空格

如果有空值

<item name="Value"></item> 变成

<item name="Value"> </item>