Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中转义xml节点值中的引号?_C#_Xml - Fatal编程技术网

如何在C#中转义xml节点值中的引号?

如何在C#中转义xml节点值中的引号?,c#,xml,C#,Xml,我正在为旧应用程序生成xml文件 它要求必须转义节点值中的引号(“and”) 但C#内置XmlWriter无法做到这一点,它不会在节点值中转义引号 在传递给node.InnerText之前,我尝试将“替换为”。 但写完之后,它变成了, 例如,我想要这种节点: <node>text contains &quot;</node> 文本包含“ 但我要么得到了这个: <node>text contains "</node> 文本包含“ 或者

我正在为旧应用程序生成xml文件

它要求必须转义节点值中的引号(“and”)

但C#内置XmlWriter无法做到这一点,它不会在节点值中转义引号

在传递给node.InnerText之前,我尝试将
替换为
。 但写完之后,它变成了

例如,我想要这种节点:

<node>text contains &quot;</node>
文本包含“
但我要么得到了这个:

<node>text contains "</node>
文本包含“
或者这个:

<node>text contains &amp;quot;</node>
文本包含;

如何在xml节点值中转义引号?

如果需要在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;
    }
}
public类PreserveQuotesXmlTextWriter:XmlTextWriter
{
私有静态只读字符串[]quoteEntites={“&apos;”,“”“};
私有静态只读字符[]引号={'\'',''''};
私有布尔属性;
public PreserveQuotesXmlTextWriter(字符串文件名):base(文件名,null)
{            
}
public override void WriteStartAttribute(字符串前缀、字符串localName、字符串ns)
{
isInsideAttribute=true;
base.WriteStartAttribute(前缀、localName、ns);
}
专用void WriteStringWithReplace(字符串文本)
{
string[]textSegments=text.Split(引号);
如果(textSegments.Length>1)
{
对于(int pos=-1,i=0;i
替换为
\”
?看起来很糟糕,您需要所有引号始终转义-这不是一个解决方案吗?节点值随后变成“\&;引用LOL那个应用程序死了,没有源代码。所以我无法修复那个应用程序。它真的很有帮助,谢谢!我的名声还不到15,投票结果不会公开,哈哈。