È possibile utilizzare una wild card o una stringa "contains" in un interruttore {case}? attenzione: wordy

c# html-agility-pack html-parsing screen-scraping

Domanda

Essendo nuovo alla programmazione, leggo un sacco di codice di esempio e provo a hackerare le cose insieme nel tentativo di imparare cosa funziona. Sto lavorando con il pacchetto html agility cercando di scartare una pagina Web di notizie.

Problema: uno dei nodi che sto testando non utilizza un valore statico, utilizza il tempo di visualizzazione. Come posso applicare questo a un metodo switch {case}. Sono aperto anche a qualsiasi suggerimento se sono fuori da questo punto di vista.

Nota anche: non ho bisogno di catturare questo nodo, se c'è un modo per saltarlo che funziona per me.

Ho deciso di usare un esempio che usa un interruttore,

var rows = doc.DocumentNode.SelectNodes(".//*[@id='weekdays']/tr");
            foreach (var row in rows)
            {
                var cells = row.SelectNodes("./td");
                string title = cells[0].InnerText;
                var valueRow = cells[2];
                switch (title)
                {
                    case "Date":
                        HtmlNode date = valueRow.SelectSingleNode("//*[starts-with(@id, 'detail_row_seek')]/td");
                        Console.WriteLine("UPC=A:\t" + date.InnerText);
                        break;

                    case "":
                        string Time = valueRow.InnerText;
                        Console.WriteLine("Time:\t" + Time);
                        break;


                    case "News":
                        string Time = valueRow.InnerText;
                        Console.WriteLine("News:\t" + News);
                        break;
                }

estratto di html

var rows = doc.DocumentNode.SelectNodes(".//*[@id='weekdays']/tr");
            foreach (var row in rows)
            {
                var cells = row.SelectNodes("./td");
                string title = cells[0].InnerText;
                var valueRow = cells[2];
                switch (title)
                {
                    case "Date":
                        HtmlNode date = valueRow.SelectSingleNode("//*[starts-with(@id, 'detail_row_seek')]/td");
                        Console.WriteLine("UPC=A:\t" + date.InnerText);
                        break;

                    case "":
                        string Time = valueRow.InnerText;
                        Console.WriteLine("Time:\t" + Time);
                        break;


                    case "News":
                        string Time = valueRow.InnerText;
                        Console.WriteLine("News:\t" + News);
                        break;
                }

.........

var rows = doc.DocumentNode.SelectNodes(".//*[@id='weekdays']/tr");
            foreach (var row in rows)
            {
                var cells = row.SelectNodes("./td");
                string title = cells[0].InnerText;
                var valueRow = cells[2];
                switch (title)
                {
                    case "Date":
                        HtmlNode date = valueRow.SelectSingleNode("//*[starts-with(@id, 'detail_row_seek')]/td");
                        Console.WriteLine("UPC=A:\t" + date.InnerText);
                        break;

                    case "":
                        string Time = valueRow.InnerText;
                        Console.WriteLine("Time:\t" + Time);
                        break;


                    case "News":
                        string Time = valueRow.InnerText;
                        Console.WriteLine("News:\t" + News);
                        break;
                }

Il problema è: la cosiddetta colonna del tempo non è statica, ma utilizza un valore temporale. C'è un modo per usare una wild card nel caso o un modo per fare un "contiene" per aggirare questo problema molto verboso?

Risposta accettata

È necessario utilizzare valori costanti in ogni caso dell'istruzione switch.

L'unico modo in cui posso pensare che tu faccia quello che stai cercando di fare è usare il default: case - in questo caso predefinito puoi testare il valore che stai cercando usando un test contains , Parse o Regex usando if .

Non sono riuscito a seguire il tuo codice di esempio HTML (mi dispiace!), Ma il C # modificato potrebbe essere simile al seguente:

            switch (title)
            {
                case "Date":
                    HtmlNode date = valueRow.SelectSingleNode("//*[starts-with(@id, 'detail_row_seek')]/td");
                    Console.WriteLine("UPC=A:\t" + date.InnerText);
                    break;


                case "News":
                    string News = valueRow.InnerText;
                    Console.WriteLine("News:\t" + News);
                    break;

                default:
                    if (regexTime.Match(title))
                    {
                        string Time = valueRow.InnerText;
                        Console.WriteLine("Time:\t" + Time);
                    }
                    break;
            }

Risposta popolare

Potresti usare il "caso predefinito:" e inserire una condizione interna che verificherebbe.

 switch (title) {
                    case "Date":
                        HtmlNode date = valueRow.SelectSingleNode("//*[starts-with(@id, 'detail_row_seek')]/td");
                        Console.WriteLine("UPC=A:\t" + date.InnerText);
                        break;

                    case "News":
                        string Time = valueRow.InnerText;
                        Console.WriteLine("News:\t" + News);
                        break;

                    case default:
                        if (whatever you need) {
                            ...
                        }
                        break;
                }



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché