我是 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: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;
}
}
我在变量 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>
在这种情况下,我如何解析出 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;
}
但我收到此错误:This document already has a 'DocumentElement' node.
at line doc.Load(reader)
。如何正确阅读以及导致问题的原因是什么?我正在使用 .NET 2.0
最佳答案
看起来您有想要使用 XML 解析器解析的 HTML。这也可能是您得到 This document already has a 'DocumentElement' node.
异常的原因:因为您有多个根节点,这在 HTML 中是允许的(或更好:容忍的),但不是 XML。
改用 HTML 解析器。不幸的是,.NET 框架中没有内置任何东西。您必须为此使用第三方库。一个非常好的是 HTML agility pack ,那个 oleksii 已经在他的评论中提到了。
编辑:
从您的评论中,我感觉您不熟悉 HTML 和 XML 之间没有直接关系这一事实。图片取自 here很好地说明了这一点:
XML 既不是 HTML 的子集,也不是相反。仅当您拥有严格的 XHTML(这种情况很少见)时,您才能拥有可以使用 XML 解析器解析的 HTML 文档。但要注意,如果此类 XHTML 文档的代码中存在错误,解析器将失败,而普通浏览器将继续显示该页面。此外,XHTML 的 future 相当不明朗,现在 HTML5 正在缓慢但稳步地走向生活......
总结:为了避免所有这些陷阱,走简单的路,选择 HTML 解析器。
关于c# - 从 HTML 节点读取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11277380/