c# - कोशिश-कैच स्टेटमेंट समाप्त होता है जबकि सी#में XML फ़ाइल के माध्यम से पाश पढ़ना




while-loop try-catch (3)

अपवाद को फेंकने के बाद मेरे पास एक गलती की स्थिति में एक महसूस reader छोड़ा जाता है ( reader.Read(); रूप में। reader.Read(); ( switch अंदर, while नहीं) सबसे ज्यादा संभावना है कि अपवाद हुआ है। फिर reader.Read()reader.Read() while कुछ भी वापस नहीं करता है, और यह बाहर निकलता है

मैंने एक कन्सोल ऐप में एक साधारण switch किया था और उसमें अपवाद और पकड़ लिया था और उसमें लूप जा रहा था।

var s = "abcdefg";
foreach (var character in s)
{
    switch (character)
    {
        case 'c':
            try
            {
                throw new Exception("c sucks");
            }
            catch
            {
                // Swallow the exception and move on?
            }
            break;
        default:
            Console.WriteLine(character);
            break;
    }
}

यदि आप कोड के माध्यम से चलते हैं, तो क्या वह reader.Read() को चलाने का प्रयास करता reader.Read() अपवाद को पकड़े जाने के while में reader.Read() ?

मेरे पास एक्सएमएल फाइल के माध्यम से एक समय लूप है, और एक नोड "url" के लिए, इसमें कभी-कभी अमान्य मान हैं मैंने किसी भी अमान्य मूल्यों को पकड़ने के लिए इस के आसपास एक कोशिश-पकड़ने का बयान रखा है। समस्या यह है, जब भी कोई अमान्य मान को पकड़ लिया जाता है, जबकि लूप को मार दिया जाता है और प्रोग्राम उस लूप के बाहर जारी रहता है। मुझे अस्थाई मान के बाद बाकी फाइलों के माध्यम से पढ़ना जारी रखने के लिए समय पाश की ज़रूरत है I

यहां मेरा कोड है:

        XmlTextReader reader = new XmlTextReader(fileName);
        int tempInt;

        while (reader.Read())
        {
            switch (reader.Name)
            {
                case "url":
                    try
                    {
                        reader.Read();
                        if (!reader.Value.Equals("\r\n"))
                        {
                            urlList.Add(reader.Value);
                        }
                    }
                    catch
                    {                            
                        invalidUrls.Add(urlList.Count);   
                    }
                    break;
            }
        }

मैंने शेष स्विच स्टेटमेंट को शामिल नहीं करना चुना क्योंकि यह प्रासंगिक नहीं है। यहां मेरे XML का एक नमूना है:

<?xml version="1.0"  encoding="ISO-8859-1" ?>
<visited_links_list>
    <item>
        <url>http://www.grcc.edu/error.cfm</url>
        <title>Grand Rapids Community College</title>
        <hits>20</hits>
        <modified_date>10/16/2012 12:22:37 PM</modified_date>
        <expiration_date>11/11/2012 12:22:38 PM</expiration_date>
        <user_name>testuser</user_name>
        <subfolder></subfolder>
        <low_folder>No</low_folder>
        <file_position>834816</file_position>
     </item>
</visited_links_list>

अपवाद जो मुझे पूरे कोड में मिलता है वह निम्नलिखित के जैसा होता है:

"', हेक्साडेसिमल मान 0x05, एक अवैध वर्ण है। रेखा 3887, स्थिति 13."


जारी रखें का उपयोग करें

while (reader.Read())
        {
            switch (reader.Name)
            {
                case "url":
                    try
                    {
                        reader.Read();
                        if (!reader.Value.Equals("\r\n"))
                        {
                            urlList.Add(reader.Value);
                        }
                    }
                    catch
                    {
                        invalidUrls.Add(urlList.Count);
                        continue;
                    }
                    break;
            }
        }

मैं मान रहा हूँ कि आप एक वैध XML दस्तावेज़ जैसे myFile.xml पढ़ रहे हैं। मैं यह भी सोच रहा हूं कि "url" वह तत्व है जिसे आप प्राप्त करना चाहते हैं।

दस्तावेज़ को एक XMLDocument वर्ग में लोड करें और उस नोड्स को पार करने के लिए उपयोग करें। इसे बुरे अक्षरों को खत्म करना चाहिए क्योंकि यह उन को सही प्रारूप में बदल देगा जैसे amp; ect ..

नीचे दी गई विधि को आपके द्वारा दिए गए उदाहरण देने के लिए काम करना चाहिए।

        //get the text of the file into a string
        System.IO.StreamReader sr = new System.IO.StreamReader(@"C:\test.xml");
        String xmlText = sr.ReadToEnd();
        sr.Close();  
        //Create a List of strings and call the method
        List<String> urls = readXMLDoc(xmlText);
        //check to see if we have a list
        if (urls != null)
        {
            //do somthing
        }


    private List<String> readXMLDoc(String fileText)
    {
        //create a list of Strings to hold our Urls
        List<String> urlList = new List<String>();
        try
        {
            //create a XmlDocument Object
            XmlDocument xDoc = new XmlDocument();
            //load the text of the file into the XmlDocument Object
            xDoc.LoadXml(fileText);
            //Create a XmlNode object to hold the root node of the XmlDocument
            XmlNode rootNode = null;
            //get the root element in the xml document
            for (int i = 0; i < xDoc.ChildNodes.Count; i++)
            {
                //check to see if it is the root element
                if (xDoc.ChildNodes[i].Name == "visited_links_list")
                {
                    //assign the root node
                    rootNode = xDoc.ChildNodes[i];
                    break;
                }
            }

            //Loop through each of the child nodes of the root node
            for (int j = 0; j < rootNode.ChildNodes.Count; j++)
            {
                //check for the item tag
                if (rootNode.ChildNodes[j].Name == "item")
                {
                    //assign the item node
                    XmlNode itemNode = rootNode.ChildNodes[j];
                    //loop through each if the item tag's elements
                    foreach (XmlNode subNode in itemNode.ChildNodes)
                    {
                        //check for the url tag
                        if (subNode.Name == "url")
                        {
                            //add the url string to the list
                            urlList.Add(subNode.InnerText);
                        }
                    }
                }
            }
        }
        catch (Exception e)
        {
            System.Windows.Forms.MessageBox.Show(e.Message);
            return null;
        }
        //return the list
        return urlList;
    }




xmltextreader