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: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);
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,b和c.但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: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;
}
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:This document already has a 'DocumentElement' node.在线doc.Load(reader).如何正确阅读以及造成麻烦的原因是什么?我使用的是.NET 2.0
看起来您要使用XML解析器解析HTML.这也可能是您获得This document already has a 'DocumentElement' node.异常的原因:因为您有多个根节点,在HTML中允许(或更好:容忍),而不是XML.
请改用HTML解析器.遗憾的是,.NET框架中没有任何内置功能.你必须为此采取第三方库.一个非常好的是HTML敏捷包,oleksii在他的评论中已经提到过.
编辑:
从您的评论中,我感觉您不熟悉HTML和XML之间没有直接关系的事实.从这里拍摄的图表很好地说明了这一点:

XML既不是HTML的子集,也不是相反的方式.只有你有严格的XHTML(很少这种情况),你才有一个可以用XML解析器解析的HTML文档.但请注意,如果此类XHTML文档的代码中存在某些错误,则解析器将失败,而常见的浏览器将继续显示该页面.此外,XHTML的未来尚不清楚,现在HTML5正在缓慢而稳定地生活......
总结:为了避免所有这些陷阱,采取简单的方法去寻找HTML解析器.