Apakah ada fungsi C # yang dapat digunakan untuk keluar dan melepaskan string, yang dapat digunakan untuk mengisi konten elemen XML?
Saya menggunakan VSTS 2008 + C # + .Net 3.0.
EDIT 1: Saya concatenating sederhana dan file XML pendek dan saya tidak menggunakan serialisasi, jadi saya perlu secara eksplisit melarikan diri karakter XML dengan tangan, misalnya, saya harus menempatkan a<b
ke dalam <foo></foo>
, jadi saya perlu melarikan diri tali a<b
dan memasukkannya ke dalam elemen foo.
new XText(unescaped).ToString()
Jawaban:
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; }
sumber
HttpUtility.HtmlEncode
dariSystem.Web
bisa digunakan dengan aman?SecurityElement.Escape (string s)
sumber
EDIT: Anda mengatakan "Saya menggabungkan file XML sederhana dan pendek dan saya tidak menggunakan serialisasi, jadi saya harus secara eksplisit melepaskan karakter XML dengan tangan".
Saya sangat menyarankan Anda untuk tidak melakukannya dengan tangan. Gunakan API XML untuk melakukan semuanya untuk Anda - baca di file asli, gabungkan keduanya menjadi satu dokumen sesuka Anda (Anda mungkin ingin menggunakannya
XmlDocument.ImportNode
), lalu tulis lagi. Anda tidak ingin menulis pengurai / pemformatan XML Anda sendiri. Serialisasi agak tidak relevan di sini.Jika Anda dapat memberi kami contoh singkat namun lengkap tentang apa yang Anda coba lakukan, kami mungkin dapat membantu Anda untuk menghindari kekhawatiran tentang melarikan diri sejak awal.
Jawaban asli
Tidak sepenuhnya jelas apa yang Anda maksud, tetapi biasanya XML API melakukan ini untuk Anda. Anda mengatur teks dalam sebuah node, dan itu akan secara otomatis melarikan diri dari apapun yang diperlukan. Sebagai contoh:
Contoh LINQ ke XML:
using System; using System.Xml.Linq; class Test { static void Main() { XElement element = new XElement("tag", "Brackets & stuff <>"); Console.WriteLine(element); } }
Contoh 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); } }
Keluaran dari kedua contoh:
<tag>Brackets & stuff <></tag>
Itu dengan asumsi Anda ingin XML melarikan diri, tentu saja. Jika tidak, harap posting detail selengkapnya.
sumber
Terima kasih kepada @sehe untuk pelarian satu baris:
var escaped = new System.Xml.Linq.XText(unescaped).ToString();
Saya menambahkan satu baris un-escape:
var unescapedAgain = System.Xml.XmlReader.Create(new StringReader("<r>" + escaped + "</r>")).ReadElementString();
sumber
George, itu sederhana. Selalu gunakan API XML untuk menangani XML. Mereka melakukan semua pelarian dan pelarian untuk Anda.
Jangan pernah membuat XML dengan menambahkan string.
sumber
XmlElementSyntax
. Dan itu juga diperumit oleh fakta bahwa Anda perlu membuat///
juga. Dan saya tidak dapat membuat setiap baris sebagai terpisahXObject
, karena itu tidak akan berfungsi untuk tag multiline.///
di depannya, lalu format ulang kode. Bukan masalah besar, dan tentu saja kasus sudut. Jika benar-benar diperlukan, saya yakin Anda dapat membuat kebiasaanXmlWriter
untuk melakukan jeda baris dan spasi seperti yang Anda inginkan, tetapi menempatkannya///
di depan baris baru. Atau, gunakan XSLT untuk mencetak XML dengan cantik. Namun bagaimanapun, XML tetap harus dibuat oleh API XML.Dan jika Anda ingin, seperti saya ketika saya menemukan pertanyaan ini, untuk keluar dari nama node XML, seperti misalnya saat membaca dari serialisasi XML, gunakan cara termudah:
XmlConvert.EncodeName(string nameToEscape)
Ini juga akan mengosongkan spasi dan karakter tidak valid untuk elemen XML.
http://msdn.microsoft.com/en-us/library/system.security.securityelement.escape%28VS.80%29.aspx
sumber
Pengambilan lain berdasarkan jawaban John Skeet yang tidak mengembalikan tag :
void Main() { XmlString("Brackets & stuff <> and \"quotes\"").Dump(); } public string XmlString(string text) { return new XElement("t", text).LastNode.ToString(); }
Ini hanya mengembalikan nilai yang diteruskan, dalam format yang dikodekan XML:
Brackets & stuff <> and "quotes"
sumber
PERINGATAN: Necromancing
Masih jawaban Darin Dimitrov + System.Security.SecurityElement.Escape (string s) belum lengkap.
Dalam XML 1.1, cara termudah dan teraman adalah dengan menyandikan SEMUANYA.
Suka
	
untuk \ t.Itu tidak didukung sama sekali dalam XML 1.0.
Untuk XML 1.0, satu solusi yang mungkin adalah dengan base-64 menyandikan teks yang berisi karakter (s).
//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("	"); //strDelimiter = XmlUnescape(";"); //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); }
sumber
Fungsi berikut akan melakukan pekerjaannya. Tidak menguji XmlDocument, tapi saya rasa ini jauh lebih cepat.
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; } } }
sumber
Menggunakan perpustakaan pihak ketiga ( Newtonsoft.Json ) sebagai alternatif:
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(); }
Contoh:
a<b
<==>"a<b"
<foo></foo>
<==>"foo></foo>"
sumber