从HTML节点读取值

naw*_*fal 5 html c# html-parsing

我是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>
Run Code Online (Sandbox Code Playgroud)

现在我需要00:00:00,00: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;
    }
 }
Run Code Online (Sandbox Code Playgroud)

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

<body id="s1" style="s1">
  <div xml:lang="uk">
      <p begin="00:00:00" end="00:00:29">I'm great! </p>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我如何解析00:00:00,00: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);

    XmlDocument doc = new XmlDocument();
    doc.Load(reader);
    XmlNode elem = doc.DocumentElement.FirstChild;
    var c = elem.InnerText;
}
Run Code Online (Sandbox Code Playgroud)

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

Phi*_*ier 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解析器.