2014-11-04 2 views
0

У меня есть несколько веб-страниц со статическими данными в таблицах разметки HTML. Под этим я имею в виду, вручную сохранить текст:Создание XML из MarkUp HTML

<table border="1" > 
<tr><th>Number</th><th>Date</th><th>BW</th><th>WW</th><th>%</th><th>Type</th><th>CED</th><th>BW</th><th>WW</th><th>YW</th><th>Mlk</th><th>Me</th></tr> 
<tr><td>313</td><td>9/16/2013</td><td>74</td><td>512</td><td>100</td><td>861U</td><td>3</td><td>-1.1</td><td>54</td><td>85</td><td>16</td><td></td></tr> 
<tr><td>315</td><td>10/6/2013</td><td>-</td><td>-</td><td>-</td><td>W179</td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td></tr> 
<tr><td>316</td><td>10/102013</td><td>72</td><td>595</td><td>94.2</td><td>W179</td><td>7</td><td>-2.3</td><td>53</td><td>80</td><td>21</td><td>-3</td></tr> 
<tr><td>350</td><td>10/11/2013</td><td>71</td><td>703</td><td>100</td><td>W179</td><td>7</td><td>-2.3</td><td>46</td><td>72</td><td>20</td><td>-5</td></tr> 
<tr><td>392</td><td>3/8/2013</td><td>61</td><td>651</td><td>100</td><td>RANGER</td><td>7</td><td>-2.3</td><td>52</td><td>82</td><td>20</td><td>-2</td></tr> 
<tr><td>303</td><td>7/3/2013</td><td>63</td><td>-</td><td>97.1</td><td>W179</td><td>8</td><td>-3.2</td><td>N/A</td><td>82</td><td>21</td><td>-8</td></tr> 
<tr><td>304</td><td>7/8/2013</td><td>62</td><td>-</td><td>97.1</td><td>W179</td><td>7</td><td>-3.9</td><td>N/A</td><td>69</td><td>20</td><td>-4</td></tr> 
<tr><td>397</td><td>3/18/2013</td><td>78</td><td>621</td><td>100</td><td>STATEMENT</td><td>6</td><td>-2.7</td><td>55</td><td>84</td><td>19</td><td>5</td></tr> 
<tr><td>395</td><td>3/17/2013</td><td>63</td><td>716</td><td>94.2</td><td>STATEMENT</td><td>5</td><td>-2.7</td><td>54</td><td>85</td><td>19</td><td>5</td></tr> 
<tr><td>390</td><td>3/6/2013</td><td>66</td><td>583</td><td>94.2</td><td>ENVY</td><td>2</td><td>-0.6</td><td>55</td><td>80</td><td>23</td><td>2</td></tr> 
<tr><td>388</td><td>3/4/2013</td><td>53</td><td>621</td><td>100</td><td>STATEMENT</td><td>10</td><td>-5.1</td><td>49</td><td>82</td><td>20</td><td>2</td></tr> 
<tr><td>300</td><td>3/22/2013</td><td>61</td><td>633</td><td>100</td><td>RANGER</td><td>8</td><td>-2.8</td><td>49</td><td>81</td><td>19</td><td>-2</td></tr> 
<tr><td>379</td><td>2/1/2013</td><td>55</td><td>518</td><td>100</td><td>STATEMENT</td><td>8</td><td>-4.1</td><td>61</td><td>98</td><td>18</td><td>1</td></tr> 
<tr><td>398</td><td>3/20/2013</td><td>62</td><td>664</td><td>100</td><td>RANGER</td><td>6</td><td>-2.3</td><td>53</td><td>83</td><td>20</td><td>0</td></tr> 
<tr><td>384</td><td>2/10/2013</td><td>61</td><td>650</td><td>100</td><td>ENVY</td><td>3</td><td>-1</td><td>50</td><td>70</td><td>19</td><td>4</td></tr> 
<tr><td>369</td><td>1/30/2013</td><td>76</td><td>651</td><td>100</td><td>STATEMENT</td><td>5</td><td>-2.4</td><td>60</td><td>99</td><td>20</td><td>8</td></tr> 
<tr><td>373</td><td>1/21/2013</td><td>71</td><td>433</td><td>100</td><td>STATEMENT</td><td>4</td><td>-1.6</td><td>55</td><td>89</td><td>17</td><td>3</td></tr> 
<tr><td>393</td><td>3/10/2013</td><td>63</td><td>717</td><td>100</td><td>STATEMENT</td><td>3</td><td>-4.6</td><td>51</td><td>91</td><td>20</td><td>5</td></tr> 
<tr><td>389</td><td>3/8/2013</td><td>72</td><td>723</td><td>88.3</td><td>ENVY</td><td>4</td><td>-0.6</td><td>54</td><td>76</td><td>24</td><td>2</td></tr> 
<tr><td>364</td><td>10/1/2012</td><td>60</td><td>574</td><td>100</td><td>RANGER</td><td>1</td><td>0.4</td><td>56</td><td>84</td><td>21</td><td>2</td></tr> 
</table> 

В настоящее время я рассматриваю, используя WebClient.DownloadString тянуть весь текст в, и попытаться создать файл XML из него путем разбора каждой строки <tr>.

Это звучит утомительно, и я предпочел бы не изобретать велосипед. Кроме того, несколько хороших решений дадут мне кое-что, чтобы взглянуть на идеи о том, как наилучшим образом подойти к написанию моей версии.

Есть ли у кого-нибудь код, который может это сделать?

Я начал, чтобы дать вам представление о том, что я работаю на:

private const string XML_DATA = "App_Data/page_data.xml"; 
    private const string TABLE_START = "<table>"; 
    private const string TABLE_STOP = "</table>"; 
    private string[] TABLE_ROW = { "<tr>", "</tr>" }; 
    private string[] TABLE_HEAD = { "<th>", "</th>" }; 
    private string[] TABLE_DET = { "<td>", "</td>" }; 

    private void load_data() { 
     if (!File.Exists(XML_DATA)) { 
      string HtmlText; 
      using (var client = new WebClient()) { 
       HtmlText = client.DownloadString(Server.MapPath("/Sales.aspx")); 
      } 
      if (!String.IsNullOrEmpty(HtmlText)) { 
       var lcTxt = HtmlText.ToLower(); 
       int len0 = TABLE_START.Length; 
       int tStart = lcTxt.IndexOf(TABLE_START) + len0; 
       int tStop = lcTxt.IndexOf(TABLE_STOP); 
       if ((len0 < tStart) && (tStart < tStop)) { 
        var tableString = HtmlText.Substring(tStart, tStop - tStart); 
        var tableRows = tableString.Split(TABLE_ROW, StringSplitOptions.RemoveEmptyEntries); 
        foreach (var row in tableRows) { 
         if (-1 < row.IndexOf(TABLE_HEAD[0])) { 
          // 
         } else { 
          // 
         } 
        } 
       } 
      } 
     } 
    } 

Конечно, вы можете увидеть, что уже происходит сбой, потому что Markup с помощью <table border="1">.

Да, легко исправить, но я бы предпочел иметь рабочее руководство, которое уже прошло через множество шагов отладки.

UPDATE: Я попытался с помощью метода LoadXmlXmlDocument «s, но он не может показаться, чтобы прочитать основные HTML:

html error

ответ

1

смотреть два видео, указанные ниже, чтобы получить представление:

https://www.youtube.com/watch?v=nNMiyILom3s&index=6&list=PL6n9fhu94yhX-U0Ruy_4eIG8umikVmBrk

https://www.youtube.com/watch?v=Sv8oFcEj0kM&index=7&list=PL6n9fhu94yhX-U0Ruy_4eIG8umikVmBrk

Если у вас возникли проблемы после просмотра этих видеороликов, вы можете бесплатно спросить ......

+0

+1 Спасибо Vishal. Идем посмотреть их сейчас. – jp2code

+1

Ссылки неодобрились в SE - вы можете подумать о суммировании видео – PhillyNJ

1

Вы определенно не должны пытаться разобрать это вручную. Другие люди уже решили эту проблему.

Если разметка действительна XML (и от того, что вы показали нам, похоже, что он есть), то вы можете просто разобрать его как XML:

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(HtmlString); 
doc.Save("myfile.xml"); 

Но по этому вопросу, если это уже действительная разметка XML, и все, что вам нужно сделать, это сохранить ее как файл, тогда вам не нужно ее разбирать. Просто сохраните его:

File.WriteAllText("myfile.xml", HtmlString); 
+0

+1. HTML не является ** просто **, что информация о таблице. Будет ли этот код бомбить, если есть другие поля, или он достаточно умен, чтобы понять это? – jp2code

+1

Проблема заключается не в том, есть ли у него другие поля, но в том, является ли разметка действительной как XML. Например, следующее не будет анализироваться успешно: '

nnn
' (без кавычек вокруг 30), '
' (без закрывающей косой черты) ' ' (nbsp не предопределен в XML). Если вы думаете, что могут быть такие вещи, вам следует рассмотреть возможность использования [HTML Agility Pack] (http://htmlagilitypack.codeplex.com/), который предназначен для синтаксического анализа HTML. – JLRishe

+0

Крысы. Это было слишком легко. Это дало мне ** XmlException ** 'Данные на корневом уровне недействительны. Строка 1, позиция 1.'Это страница, построенная с использованием главной страницы, поэтому строка 1, позиция 1 начинается с' <% @ Page Title = ... '. – jp2code

Смежные вопросы