와일드 카드 또는 문자열 "contains"를 스위치 {case}에 사용할 수 있습니까? 주의 사항 : 말씨

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

문제

프로그래밍에 익숙하지 않아서 많은 샘플 코드를 읽고 어떤 것이 작동 하는지를 배우기 위해 함께 해킹하려고 시도합니다. 나는 뉴스 웹 페이지를 스크랩하려고하는 html 민첩성 팩으로 작업 중이다.

문제 : 내가 테스트중인 노드 중 하나가 정적 값을 사용하지 않으며, 시각을 사용합니다. 이것을 switch {case} 메소드에 어떻게 적용 할 수 있습니까? 나는이 모든 접근법에서 근본적인 차이가 없다면 어떤 제안도 할 수있다.

참고 :이 노드를 건너 뛸 수있는 방법이 있으면이 노드를 캡처 할 필요가 없습니다.

나는 스위치를 사용하는 exapmle을 사용하기로 결정했다.

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;
                }

html의 발췌

<table id="weekdays" cellpadding="6" cellspacing="0" border="0" width="100%">
                    <tr>
                        <td class="thead" style="border-bottom: 1px solid #d1d1e1;font-weight:normal; text-align: center; width:8%; padding-left: 6px;">Date</td>
                        <td class="thead" style="border-bottom: 1px solid #d1d1e1;font-weight:normal; width:8%; text-align: center; white-space:nowrap"><a href="guestcp.php?do=customoptions" title="Time &amp; Date Options"><img style="position:relative; vertical-align: bottom;" src="images/misc/clock_small.gif" title="Time &amp; Date Options" alt="Time &amp; Date Options" border="0" /></a><a href="guestcp.php?do=customoptions" title="Time &amp; Date Options"><span id="ff_nowtime_clock">3:20pm</span></a></td>
                        <td class="thead" style="border-bottom: 1px solid #d1d1e1;font-weight:normal; text-align: center; width:8%;">News</td>

.........

                    <tr id="detail_row_seek_37876">

        <td id="toprow_9" class="alt1 espace" rowspan="3" style="vertical-align: top; text-align: center;" nowrap="nowrap">
            <span class="smallfont">
                <div>Sat</div>
                Apr 9
            </span>
        </td>

    <td class="alt1 espace" style="text-align: center;" nowrap="nowrap">

            <span class="smallfont">Day 3</span>


    </td>
    <td class="alt1 espace" style="text-align: center;"><span class="smallfont">EUR</span></td>
    <td class="alt1 espace" style="padding-top: 2px" align="center">


<a name="chart=37876" style="position:absolute; margin-top: -10px;"></a><a name="details=37876" style="position:absolute; margin-top: -10px;"></a>


<div class="cal_imp_medium" title="Medium Impact Expected"></div></td>
    <td class="alt1 espace">

        <div class="smallfont" id="title_37876" style="padding-left: 11px;">ECOFIN Meetings</div>

    </td>

문제는 다음과 같습니다. 소위 시간 열은 정적이 아니며 실제 시간 값을 사용합니다. 케이스에 와일드 카드를 사용하는 방법 또는이 단어적인 문제를 해결하기 위해 "포함"을 수행하는 방법이 있습니까?

수락 된 답변

switch 문을 사용할 때마다 상수 값을 사용해야합니다.

당신이하고자하는 일을하기 위해 당신이 할 수있는 유일한 방법은 default: case를 사용하는 것입니다 -이 기본 경우 contains if 를 사용하여 contains , Parse 또는 Regex 테스트를 사용하여 찾고있는 값을 테스트 할 수 있습니다.

나는 당신의 HTML 샘플 코드를 따라갈 수 없다 (미안하다!). 그러나 수정 된 C #은 다음과 같이 보일 것이다 :

            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;
            }

인기 답변

"case default :"를 사용하여 내부에 조건을 넣어 점검 할 수 있습니다.

 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;
                }


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.