【问题标题】:Creating XML from MarkUp HTML从 MarkUp HTML 创建 XML
【发布时间】:2014-12-31 19:30:13
【问题描述】:

我有一些网页在 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 来提取所有文本,并尝试通过解析每一行&lt;tr&gt; 来创建一个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 {
                          //
                        }
                    }
                }
            }
        }
    }

当然,你可以看到已经失败了,因为标记使用&lt;table border="1"&gt;

是的,很容易修复,但我宁愿有一个已经通过大量调试步骤的工作指南。

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

【问题讨论】:

    标签: c# html xml


    【解决方案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

    如果您在观看这些视频后有任何问题,请随时询问......

    【讨论】:

    • 链接在 SE 中不受欢迎 - 您可能会考虑总结视频
    【解决方案2】:

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

    如果您的标记是有效的 XML(从您向我们展示的内容来看,它看起来确实如此),那么您可以将其解析为 XML:

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

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

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

    【讨论】:

    • +1。 HTML 不是只是该表信息。如果还有其他领域,该代码会爆炸吗?还是它足够聪明才能弄清楚?
    • 问题不在于是否有其他字段,而在于标记是否作为XML有效。例如,以下将无法成功解析:&lt;div height=30&gt;nnn&lt;/div&gt;(30 周围没有引号)、&lt;br&gt;(没有右斜杠)&amp;nbsp;(nbsp 未在 XML 中预定义)。如果您认为可能存在这样的情况,您应该考虑使用专为解析 HTML 而设计的HTML Agility Pack
    • 老鼠。这太容易了。这给了我一个 XmlException Data at the root level is invalid. Line 1, position 1. 这是一个使用母版页构建的页面,因此第 1 行,位置 1 以 &lt;%@ Page Title=... 开头。
    • ASP.NET 语法既不是有效的 XML,也不是有效的 HTML。您可以尝试在解析之前先删除所有 ASP.NET 内容:`HtmlString = Regex.Replace(HtmlString, "", "");
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 2011-10-02
    • 2021-01-09
    相关资源
    最近更新 更多