5

我是 XML/HTML 解析的新手。甚至不知道正确搜索重复项的正确词。

我有这个看起来像这样的 HTML 文件:

<body id="s1" style="s1">
    <div xml:lang="uk">
        <p begin="00:00:00" end="00:00:29">
          <span fontFamily="SchoolHouse Cursive B" fontSize="18">I'm great!</span>
        </p>

现在我需要00:00:0000:00:29I'm great!从中。我可以这样读:

XmlTextReader reader = new XmlTextReader(file);
while (reader.Read())
{
    if (reader.NodeType != XmlNodeType.Element)
        continue;

    if (reader.LocalName != "p")
        continue;

    var a = reader.GetAttribute(0);
    var b = reader.GetAttribute(1);

    if (reader.LocalName == "span")
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(reader);
        XmlNode elem = doc.DocumentElement.FirstChild;
        var c = elem.InnerText;
    }
 }

我得到变量中的值abc。但 HTML 格式略有变化。现在 HTML 看起来像这样:

<body id="s1" style="s1">
  <div xml:lang="uk">
      <p begin="00:00:00" end="00:00:29">I'm great! </p>

在这种情况下,我该如何解析00:00:0000:00:29以及I'm great!?我试过这个:

XmlTextReader reader = new XmlTextReader(file);
while (reader.Read())
{
    if (reader.NodeType != XmlNodeType.Element)
        continue;

    if (reader.LocalName != "p")
        continue;

    var a = reader.GetAttribute(0);
    var b = reader.GetAttribute(1);

    XmlDocument doc = new XmlDocument();
    doc.Load(reader);
    XmlNode elem = doc.DocumentElement.FirstChild;
    var c = elem.InnerText;
}

但我得到这个错误:This document already has a 'DocumentElement' node.在 line doc.Load(reader)。如何正确阅读以及造成问题的原因是什么?我正在使用 .NET 2.0

4

2 回答 2

6

看起来您有想要使用 XML 解析器解析的 HTML。这也可能是您得到This document already has a 'DocumentElement' node.异常的原因:因为您有多个根节点,这在 HTML 中是允许的(或者更好的是:容忍),但在 XML 中是不允许的。

请改用 HTML 解析器。不幸的是,.NET 框架中没有内置任何内容。您必须为此使用第三方库。一个很好的是HTML 敏捷包,oleksii 在他的评论中已经提到过。

编辑:

从您的评论中,我感觉到您不熟悉 HTML 和 XML 之间没有直接关系的事实。取自这里的图形很好地说明了这一点:

SGML、HTML 和 XML 之间的关系

XML 也不是 HTML 的子集,反之亦然。只有当您有严格的 XHTML(很少出现这种情况)时,您才有可以用 XML 解析器解析的 HTML 文档。但请注意,如果此类 XHTML 文档的代码出现错误,解析器将失败,而普通浏览器将继续显示该页面。此外,XHTML 的未来还很不明朗,现在 HTML5 正在缓慢而稳定地出现......

总结一下:为了避免所有这些陷阱,走简单的路,选择 HTML 解析器。

于 2012-06-30T20:29:23.947 回答
3

由于您要解析 HTML,您可以使用WebClient(或WebBrowser) 加载页面,然后使用 HTML DOM 浏览它。您需要Microsoft HTML Object Library为以下代码示例添加对 (COM) 的引用:

  string html;
  WebClient webClient = new WebClient();
  using (Stream stream = webClient.OpenRead(new Uri("http://www.google.com")))
  using (StreamReader reader = new StreamReader(stream))
  {
    html = reader.ReadToEnd();
  }
  IHTMLDocument2 doc = (IHTMLDocument2)new HTMLDocument();
  doc.write(html);
  foreach (IHTMLElement el in doc.all)
    Console.WriteLine(el.tagName);

我之前曾尝试将 HTML 加载到 XML 中,但它太难了——修复未封闭的标签(如 <BR>)、在属性周围加上引号、为没有值的属性赋予值等。因为我想随后使用 XSLT 来对付它,在加载到 HTML DOM 并在其中导航后,为每个 HTML 节点创建相关的 XML 节点。然后我有了 HTML 的正确 XML 表示。

于 2012-07-01T05:26:24.383 回答