从MarkUp HTML创建XML

时间:2014-11-04 19:11:36

标签: c# html xml

我有几个网页在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来提取所有文本,并尝试通过解析每一行<tr>来创建XML文件。

这听起来很乏味,我宁愿不重新发明轮子。此外,一些好的解决方案可以让我看到有关如何最好地编写我的版本的想法。

有没有人遇到过一些可以做到这一点的代码?

我已经开始了,让你知道我在做什么:

    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 {
                          //
                        }
                    }
                }
            }
        }
    }

当然,您可以看到已经失败,因为标记使用<table border="1">

是的,很容易修复,但我宁愿有一份工作指南已经完成了很多调试步骤。

更新:我尝试使用XmlDocumentLoadXml方法,但似乎无法阅读基本HTML:

html error

2 个答案:

答案 0 :(得分: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

如果您在观看这些视频后遇到任何问题,可以随意提问......

答案 1 :(得分:1)

你绝对不应该尝试手动解析它。其他人已经解决了这个问题。

如果您的标记是有效的XML(以及您向我们展示的内容,它看起来就是这样),那么您只需将其解析为XML:

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

但就此而言,如果它已经是有效的XML标记,并且您需要做的就是将其保存为文件,那么您不需要解析它。只需保存它:

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