字符串转义成XML字符串转义成XML(String escape into XML)

2019-06-14 14:09发布

是否有任何C#功能,可用于逃生和未逃脱一个字符串,它可以用来填补在XML元素的内容?

我使用VSTS 2008 + C#+ NET 3.0。

编辑1:我是串联简单和短期的XML文件,我不使用序列化,所以我需要明确地逃避手XML字符,例如,我需要把a<b<foo></foo>所以我需要逃避串a<b放入元素富。

Answer 1:

public static string XmlEscape(string unescaped)
{
    XmlDocument doc = new XmlDocument();
    XmlNode node = doc.CreateElement("root");
    node.InnerText = unescaped;
    return node.InnerXml;
}

public static string XmlUnescape(string escaped)
{
    XmlDocument doc = new XmlDocument();
    XmlNode node = doc.CreateElement("root");
    node.InnerXml = escaped;
    return node.InnerText;
}


Answer 2:

SecurityElement.Escape(字符串s)



Answer 3:

编辑:你说“我简单的串联和短期XML文件,我不使用序列化,所以我需要手动明确逃离XML字符”。

强烈建议你不要用手工做。 使用XML的API做这一切为你-在原来的文件中读取,合并两成一个单一的文件,但是你需要(你可能想使用XmlDocument.ImportNode ),然后再将它写出来的。 你不想写自己的XML解析器/格式化。 序列化是有点这里无关紧要。

如果你可以给我们你想要做的正是一个简短而完整的例子,我们或许可以帮助你避免不必担心在第一时间逃离。


原来的答案

这不是完全清楚你的意思,但通常的XML API为你做这个。 您可以设置节点中的文本,它会自动跳脱任何需要的地方。 例如:

LINQ到XML例子:

using System;
using System.Xml.Linq;

class Test
{
    static void Main()
    {
        XElement element = new XElement("tag",
                                        "Brackets & stuff <>");

        Console.WriteLine(element);
    }
}

DOM例如:

using System;
using System.Xml;

class Test
{
    static void Main()
    {
        XmlDocument doc = new XmlDocument();
        XmlElement element = doc.CreateElement("tag");
        element.InnerText = "Brackets & stuff <>";
        Console.WriteLine(element.OuterXml);
    }
}

从两个例子中的输出:

<tag>Brackets &amp; stuff &lt;&gt;</tag>

这是假设你想XML转义,当然。 如果你没有,请张贴更多的细节。



Answer 4:

由于@sehe为单行逃生:

var escaped = new System.Xml.Linq.XText(unescaped).ToString();

我给它添加了一个行未越狱:

var unescapedAgain = System.Xml.XmlReader.Create(new StringReader("<r>" + escaped + "</r>")).ReadElementString();


Answer 5:

乔治,这很简单。 始终使用XML API来处理XML。 他们做所有的转义非转义为您服务。

千万不要通过附加字符串创建XML。



Answer 6:

如果你想和我一样,当我发现这个问题,为了躲避XML节点的名称,例如像从XML序列读取时,使用最简单的方法:

XmlConvert.EncodeName(string nameToEscape)

它也将难逃空间和XML元素任何非有效的字符。

http://msdn.microsoft.com/en-us/library/system.security.securityelement.escape%28VS.80%29.aspx



Answer 7:

警告:Necromancing

不过达林季米特洛夫的答案+ System.Security.SecurityElement.Escape(String s)将是不完整的。

在XML 1.1,最简单和最安全的方式是只编码一切。
&#09; 为\吨。
它不是在XML 1.0的所有支持。
对于XML 1.0,一种可能的解决方法是基于64位编码包含字符(多个)的文本。

//string EncodedXml = SpecialXmlEscape("привет мир");
//Console.WriteLine(EncodedXml);
//string DecodedXml = XmlUnescape(EncodedXml);
//Console.WriteLine(DecodedXml);
public static string SpecialXmlEscape(string input)
{
    //string content = System.Xml.XmlConvert.EncodeName("\t");
    //string content = System.Security.SecurityElement.Escape("\t");
    //string strDelimiter = System.Web.HttpUtility.HtmlEncode("\t"); // XmlEscape("\t"); //XmlDecode("&#09;");
    //strDelimiter = XmlUnescape("&#59;");
    //Console.WriteLine(strDelimiter);
    //Console.WriteLine(string.Format("&#{0};", (int)';'));
    //Console.WriteLine(System.Text.Encoding.ASCII.HeaderName);
    //Console.WriteLine(System.Text.Encoding.UTF8.HeaderName);


    string strXmlText = "";

    if (string.IsNullOrEmpty(input))
        return input;


    System.Text.StringBuilder sb = new StringBuilder();

    for (int i = 0; i < input.Length; ++i)
    {
        sb.AppendFormat("&#{0};", (int)input[i]);
    }

    strXmlText = sb.ToString();
    sb.Clear();
    sb = null;

    return strXmlText;
} // End Function SpecialXmlEscape

XML 1.0:

public static string Base64Encode(string plainText)
{
    var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
    return System.Convert.ToBase64String(plainTextBytes);
}

public static string Base64Decode(string base64EncodedData)
{
    var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
    return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
}


Answer 8:

以下功能将做的工作。 没有测试对XmlDocument的,但我想这是要快得多。

public static string XmlEncode(string value)
{
    System.Xml.XmlWriterSettings settings = new System.Xml.XmlWriterSettings 
    {
        ConformanceLevel = System.Xml.ConformanceLevel.Fragment
    };

    StringBuilder builder = new StringBuilder();

    using (var writer = System.Xml.XmlWriter.Create(builder, settings))
    {
        writer.WriteString(value);
    }

    return builder.ToString();
}

public static string XmlDecode(string xmlEncodedValue)
{
    System.Xml.XmlReaderSettings settings = new System.Xml.XmlReaderSettings
    {
        ConformanceLevel = System.Xml.ConformanceLevel.Fragment
    };

    using (var stringReader = new System.IO.StringReader(xmlEncodedValue))
    {
        using (var xmlReader = System.Xml.XmlReader.Create(stringReader, settings))
        {
            xmlReader.Read();
            return xmlReader.Value;
        }
    }
}


Answer 9:

使用第三方库( Newtonsoft.Json )作为替代:

public static string XmlEncode(string unescaped)
{
    if (unescaped == null) return null;
    return JsonConvert.SerializeObject(unescaped); ;
}

public static string XmlDecode(string escaped)
{
    if (escaped == null) return null;
    return JsonConvert.DeserializeObject(escaped, typeof(string)).ToString();
}

例:

a<b <==> "a&lt;b"

<foo></foo> <==> "foo&gt;&lt;/foo&gt;"



Answer 10:

根据约翰飞碟双向的答案另取不返回的标签

void Main()
{
    XmlString("Brackets & stuff <> and \"quotes\"").Dump();
}

public string XmlString(string text)
{
    return new XElement("t", text).LastNode.ToString();
} 

这将返回刚刚通过的,在XML编码格式的值:

Brackets &amp; stuff &lt;&gt; and "quotes"


文章来源: String escape into XML