2011-01-24 12 views
7

मैं XML डेटा है कि मैं एक वेब सेवा से खींच लिया के साथ एक स्ट्रिंग है। डेटा बदसूरत है और xml के नाम टैग में कुछ अमान्य वर्ण हैं। उदाहरण के लिए, मुझे कुछ ऐसा दिखाई दे सकता है:निकाला जा रहा है अमान्य वर्ण - रेगुलर एक्सप्रेशन से सी #

<Author>Scott the Coder</Author><Address#>My address</Address#> 

पता नाम फ़ील्ड में # अमान्य है। मैं एक नियमित अभिव्यक्ति की तलाश में हूं जो नाम टैग से सभी अमान्य वर्णों को हटा देगा लेकिन सभी वर्णों को xml के मान अनुभाग में छोड़ दें। दूसरे शब्दों में, मैं केवल शुरुआती नाम टैग और नाम टैग बंद करने से वर्णों को हटाने के लिए RegEx का उपयोग करना चाहता हूं। बाकी सब कुछ एक ही remaing करना चाहिए।

मैं अभी तक सभी अमान्य वर्ण की जरूरत नहीं है, लेकिन यह हो जाएगा मुझे शुरू कर दिया: # {} &()

यह मैं क्या करने की कोशिश कर रहा हूँ करने के लिए संभव है?

+2

"XML डेटा" जैसी चीजों का जिक्र करना टालना एक अच्छा विचार है। यह एक्सएमएल नहीं है। यही कारण है कि आपको इसके साथ परेशानी हो रही है। आपको डेटा के सप्लायर को जागरूक करने की आवश्यकता है कि उनका आउटपुट जंक है। –

+1

हां, यही मुझे करने की ज़रूरत है। किसी समस्या को हल करते समय इस संदेश बोर्ड पर चीजों को आजमाने और सरल बनाने का कोई कारण नहीं है। मुझे सिर्फ उस लड़के की तलाश करनी चाहिए जिसने ऐसा किया और उसे बताया कि वह एक बुरे लड़के हैं। इससे मेरी समस्या हल हो जाएगी .... एर, रुको, नहीं .. मुझे अभी भी एक ही समस्या है ... अगला! – Scott

+0

आप अस्वीकृत पात्रों को '$' जोड़ना चाहेंगे। – TinyTimZamboni

उत्तर

1

मैं दो पाठ क्षेत्रों और एक बटन के साथ एक सरल रूप था। ऐसा लगता है कि यह चाल है।

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Text.RegularExpressions; 

namespace WindowsFormsApplication3 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Regex r = new Regex(@"(?<=\<\w+)[#\{\}\(\)\&](?=\>)|(?<=\</\w+)[#\{\}\(\)\&](?=\>)"); 
      textBox2.Text = r.Replace(textBox1.Text, new MatchEvaluator(deleteMatch)); 
     } 

     string deleteMatch(Match m) { return ""; } 
    } 
} 
+0

स्ट्रिंग बहुत बड़ा हो सकता है क्योंकि मैं स्ट्रिंग को एक से अधिक बार खोजने से बचने की कोशिश कर रहा हूं। हालांकि, अगर मुझे ऐसा करने के लिए एक स्वच्छ RegEx तरीका नहीं मिल रहा है, तो मुझे बस एक पार्सर लिखने में कुछ समय बिताना होगा जो बस यही करता है। – Scott

+0

अब मैं बेहतर समझता हूं। ऐसा कुछ ऐसा लगता है जो मदद करेगा: http://www.perlmonks.org/?node_id=518444 (मेरा मतलब है आगे देखो और पीछे देखो, पर्ल भाग नहीं)। ठीक है उन्हें सी # regexp के लिए मिला: (? = ...) \t एक सकारात्मक लुकहेड (?! ...) \t एक नकारात्मक लुकहेड (? <= ...) \t एक सकारात्मक दिखने वाला। (? Marco

1

RegEx तब तक जाने का एक समस्याग्रस्त तरीका है जब तक कि आपके पास वास्तव में प्रक्रिया करने के लिए केवल एक फ़ाइल न हो। दर्द, कुंठा, कीड़े अपने भविष्य वहाँ ...

है मैं तुम्हें वास्तव में एक रेगुलर एक्सप्रेशन से उपयोग करना चाहते हैं, वहाँ उपयोगी लोगों HERE कि मैं पर्ल में इस्तेमाल किया है कर रहे हैं।

क्या आपने इसके बजाय एक पार्सर का उपयोग करने पर विचार किया है?

दो विचार करने के लिए:

LINQ for XML

XmlDocument

एक बार पार्स, तो आप कर सकते हैं परेशानी वर्गों को फिर से बचाने के लिए या सिर्फ अपने programatic रास्ते पर चलते हैं।

+0

मुझे यकीन नहीं है कि ये वर्ण टैग नामों के लिए मान्य हैं या नहीं, लेकिन यदि वे नहीं हैं तो आप xml को पार्स करने में सक्षम नहीं हो सकते हैं (वास्तव में, यह हो सकता है कि इस प्रश्न का कारण क्या हो)। यदि आप इसे पार्स कर सकते हैं, तो आपको इसे ठीक करने की ज़रूरत नहीं है। अलग-अलग पार्सर्स विचारों के साथ प्रयास करना उचित है। – Kobi

+0

वास्तव में, XMLDocument वह जगह है जहां मेरी समस्या है। XmlDoc.LoadXml (xmlString) जब XMLDocument फेंकता है। मुझे पार्सर के माध्यम से इसे चलाने से पहले इसे ठीक करने की ज़रूरत है। जब तक XMLDocument के बारे में कुछ नहीं है जो मैं नहीं जानता, मैं इस तरह इसका उपयोग नहीं कर सकता ?? – Scott

+0

@Kobi ये सभी वर्ण तत्व नामों में अमान्य हैं। कोई अनुरूप एक्सएमएल पार्सर इस इनपुट को स्वीकार नहीं करेगा। –

5

आपका इरादा केवल एक xml नोड के लिए एक नाम की वैधता की जांच करने के लिए है, तो मैं आपको XmlConvert वर्ग पर एक नज़र लेने के लिए सुझाव देते हैं; खासकर VerifyName और VerifyNCName विधियां।

यह भी ध्यान रखें कि उस कक्षा के साथ, आप EncodeName और EncodeLocalName विधियों का उपयोग करके किसी भी पाठ को नोड नाम के रूप में स्वीकार कर सकते हैं।

उन तरीकों का उपयोग करना सुरक्षित, काफी आसान है और एक नियमित अभिव्यक्ति प्रदर्शन की तुलना में तेजी हो जाएगा। एक दाईं ओर इंगित एक (>) है, जो इंगित करता है कि मैच एक टैग के अंदर हुआ अग्रदर्शी सफल होता है

s = Regex.Replace(s, @"[#{}&()]+(?=[^<>]*>)", ""); 

हैं, तो मैच के बाद अगले कोण कोष्ठक है:

+1

ध्यान दें कि सत्यापन * नाम विधियां एक अपवाद फेंकती हैं जो एक पर्फ हिट होगी। – hcoverlambda

1

इस प्रयास करें।

बेशक

, इस मान लिया गया पाठ यथोचित अच्छी तरह से गठित है और यह टैग में लोगों से अलग नहीं कोण कोष्ठक मौजूद है।

1

आप स्ट्रिंग का उपयोग कर सकते हैं सभी अमान्य chracters को बदलने के लिए बदलें। आमतौर पर एएससीआई नियंत्रण वर्ण XML पढ़ने में समस्या पैदा करेंगे।

उपयोग इस समारोह

 public static string CleanInvalidXmlChars(this 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, ""); 
    } 


    xmlcontent = xmlcontent.CleanInvalidXmlChars(); 

इस नियमित अभिव्यक्ति में निर्दिष्ट chracters साफ होगा बचने के लिए। i get this from this site

+0

मुझे लगता है कि यह regex "x10FFFF" से पहले "\" गायब है। उदाहरण के लिए यह \ x10 बाहर नहीं पड़ेगा –

संबंधित मुद्दे