SORU
21 AĞUSTOS 2008, PERŞEMBE


Nasıl verileri kullanan XmlReader veya bir XPathDocument oluşturmak için XML tabanlı bir veri kaynağı önce bir geçersiz onaltılık karakter kaldırılsın mı?

Var mı kolay/genel şekilde temiz bir XML tabanlı veri kaynağı önce kullanarak bir XmlReader böylece ben dikkatlice tüketmek XML veri olmayan uyumluluğunu onaltılık karakter kısıtlamıştı XML?

Not:

  • Çözüm XML ele almak gerekiyor veri karakteri kullanan kaynakları kodlamayı UTF-8, örneğin dışında karakter kodlama belirtme XML belge yayınlamıştır. Değil karakter kodlama bozma geçersiz striptiz yaparken kaynak onaltılık karakterler olmuştur önemli bir düğüm noktası.
  • Geçersiz onaltılık karakter kaldırılması sadece sık sık başına gelen verileri href değerleri onaltılık karakter dizesi bir maç olacak bir dize içerir bulabilirsiniz onaltılık kodlanmış değerleri kaldırmak gerekir.

Arka plan:

İhtiyacım tüketmek için XML tabanlı bir veri kaynağı uyan bir özel biçim (sanırım Atom veya RSS), ama ister yapabilmek için tüketmek veri kaynakları onun yayımladığı içeren geçersiz onaltılık karakter başına XML belirtimi.

.NET bir Akışı temsil eden bir XML veri kaynağı, ve daha sonra denemesi için ayrıştırma kullanarak bir XmlReader ve/veya XPathDocument, bir özel durum kaldırdı nedeniyle içerme geçersiz onaltılık karakter XML veri. Benim şimdiki girişimi için bu sorunu çözmek için ayrıştırma Akışı gibi bir dize ve bir düzenli ifade için kaldırma ve/veya değiştirme geçersiz onaltılık karakter, ama arıyorum daha fazla ölçülebilir çözüm.

CEVAP
13 Mart 2009, Cuma


Eugene beyaz konseptini sevdim. Orijinal poster gibi benzer bir şey yapmak istedim, ama tüm Unicode karakterleri desteklemek için değil, sadece 0x00FD kadar ihtiyacım vardı. XML spec:

= #X9 | #Char xA | #xD [#x20-#xD7FF] | | [#xE000-#xFFFD] [#x10000-#x10FFFF]|

.NET, Unicode karakterlerin iç temsili değil `izin veremeyiz' 0x10000-0x10FFFF açıkça. yani sadece 16 bit, XML açıkça specizin vermiyoryedek kodu görünmesini 0xD800 de başlangıç noktası. Ancak mümkündür ki, eğer biz izin Bu yedek kod noktaları olarak bizim beyaz, utf-8 kodlaması bizim dize olabilir üretmek geçerli bir XML sonuna kadar doğru utf-8 kodlama üretilen çiftlerini utf-16 karakter .NET dize. Daha güvenli bir bahis ile gittim bu olsa araştırdı, görmedim ve benim beyaz liste içinde Suretler izin vermedi.

Eugene çözüm açıklamalarda, sorun hariç biz bu karakterler içinde geçerli olmadığı halde yanıltıcıXML... gayet geçerli bir Unicode kod noktaları. `- Utf-8 olmayan karakterleri çıkarmak'. İyi biçimlendirilmiş XML belgeleri görünmeyebilir utf-8 karakter görülmez.

public static string XmlCharacterWhitelist( string in_string ) {
	if( in_string == null ) return null;

	StringBuilder sbOutput = new StringBuilder();
	char ch;

	for( int i = 0; i < in_string.Length; i   ) {
		ch = in_string[i];
		if( ( ch >= 0x0020 && ch <= 0xD7FF ) || 
			( ch >= 0xE000 && ch <= 0xFFFD ) ||
			ch == 0x0009 ||
			ch == 0x000A || 
			ch == 0x000D ) {
			sbOutput.Append( ch );
		}
	}
	return sbOutput.ToString();
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Christian Atlas

    Christian At

    26 Mart 2009
  • FrankJavCee

    FrankJavCee

    29 Kasım 2008
  • Submissions101

    Submissions1

    23 ŞUBAT 2007