2015-04-20 18 views
5

XML dosyasındaki geçersiz karakterleri kaldırmaya takılıyorum.XML'den geçersiz karakterleri kaldırma Dize C#

using (var cmd = new SqlCommand(Context.Command, connection)) 
{ 
    cmd.CommandTimeout = Context.CommandTimeout; 

    using (var reader = cmd.ExecuteReader()) 
    { 

     StringBuilder xmlResults = new StringBuilder(string.Empty); 

     while (reader.Read()) 
     { 
      xmlResults.Append(reader.GetString(0)); 
     } 

     if (!string.IsNullOrWhiteSpace(xmlResults.ToString())) 
     { 
      var doc = new XmlDocument(); 
      XmlReader xmlReader = XmlReader.Create(new StringReader(xmlResults.ToString())); 

      doc.Load(xmlReader); 

      var nav = doc.CreateNavigator(); 
      var objs = nav.Select("/index/type"); 

      foreach (XPathNavigator obj in objs) 
      { 
       o.OnNext(obj); 
      } 
     } 

    } 
} 

Ben CleanInvalindXmlChars kaydırma denedim

public static string CleanInvalidXmlChars(string text) 
{ 
    // From xml spec valid chars: 
    // #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]  
    // any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. 
    string re = @"[^\x09\x0A\x0D\x20-\xD7FF\xE000-\xFFFD\x10000-x10FFFF]"; 
    return Regex.Replace(text, re, ""); 
} 

Ve burada SQL Server veri okuyan benim kod, (iyi bir pasajı): Ben kullanılamaz neler herşeyi şerit olmalıdır RegEx tarzı buldum

while (reader.Read()) 
{ 
    xmlResults.Append(CleanInvalindXmlChars(reader.GetString(0))); 
} 

Ya

XmlReader xmlReader = XmlReader.Create(new StringReader(CleanInvalindXmlChars(xmlResults.ToString()))); 
yılında: çeşitli yerlerde

Okuduğum bir hücrede x0B simgesi var (Bunu SQL Server'da değiştirebilirim, ancak güvende olmak istiyorum).

Ancak, hep hata ile

System.Xml.XmlException kadar bitiriyorum: '', onaltılık değer 0x0B, geçersiz karakterdir. Hat 115, pozisyon 33407.

Bunu çözmeme yardım eden var mı?

+1

x10FFFF'den önce ters eğik çizgi eksiksiniz. Ancak, bu sorunu çözeceğinden şüpheliyim. –

+0

Bu "VT" sembolünü "input = Regex.Replace (input, @" [\ x0B] ", string.Empty) ile kaldırmayı denediniz mi? Ayrıca, bu geçersiz XML char regex'ine ihtiyacım olduğuna inanıyorum - '[\ u0000- \ u0008 \ u000B- \ u000C \ u000E- \ u0019] +' - bir dizeden tüm geçersiz XML karakterlerini eşleştirmek ve kaldırmak. –

cevap

1

Bu, dize verilerinizi temizlemek için Regex olmayan bir yöntemdir.

public static string stripNonValidXMLCharacters(string textIn) 
{ 
    if (String.IsNullOrEmpty(textIn)) 
     return textIn; 

    StringBuilder textOut = new StringBuilder(textIn.Length); 

    foreach (Char current in textIn) 
     if ((current == 0x9 || current == 0xA || current == 0xB || current == 0xD) || 
      ((current >= 0x20) && (current <= 0xD7FF)) || 
      ((current >= 0xE000) && (current <= 0xFFFD)) || 
      ((current >= 0x10000) && (current <= 0x10FFFF))) 
      textOut.Append(current); 

    return textOut.ToString(); 
} 
+0

Metodunu denedim, ancak hala sorunla karşı karşıyayım. Belki 'stripNonValidXMLCharacters' yanlış yere koydum? Ben 'XmlReader xmlReader = XmlReader.Create o yapıyorum (yeni StringReader (stripNonValidXMLCharacters (xmlResults.ToString())));' Maalesef bu konuda rahatsız etmek, ancak C# tamamen yeniyim –

+0

bunu değiştirdi Statik bir yönteme, muhtemelen sorununuzu çözmeniz gerekir – Jaco

+0

Teşekkürler, Çözdü. –

2

Here kabul edilen bir answer ve ben (kod aşağıya kopyalanmıştır) tercih alternatif answer ile aynı soru: Ne gönderdiniz Regex tarafından kaldırılmaz 0x0B ekledik.

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(); 
} 
İlgili konular