【已解决】C#中对于XmlNode,去用SelectNodes或SelectSingleNode查找,结果找不到(子节点)

【问题】

折腾:

【记录】C#中的HTML解析

过程中,对于内容为:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml" xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en" >
  <head>
  ...
</head>
<body>
    ...
    <div class="gig-wrapper " data-gig_id="103857" id="gig_id-103857">
        ...
    </div>
</body>
</html>

的html,转换为xml后,调用对应的SelectNodes或SelectSingleNode去查找gig-wrapper:

XmlNodeList gigDataList = xmlDoc.SelectNodes("//div[@data-gig_id]");

结果却找不到。

【解决过程】

1.后来参考了:

System.Xml.XmlDocument.SelectNodes() 查询不到节点问题?

使用写成:

XmlDocument xmlDoc = htmlToXmlDoc(searchResultHtml);

XmlNamespaceManager m = new XmlNamespaceManager(xmlDoc.NameTable);
m.AddNamespace("w3org", "http://www.w3.org/1999/xhtml");

//XmlNodeList nodes00 = xmlDoc.SelectNodes("//w3org:div", m);
//XmlNodeList nodes01 = xmlDoc.SelectNodes("//w3org:div[@class]", m);
//XmlNodeList nodes02 = xmlDoc.SelectNodes("//w3org:div[@class='gig-inner']", m);
//XmlNodeList nodes03 = xmlDoc.SelectNodes("//w3org:div[@class='gig-image gig-index constrained']", m);
XmlNodeList gigDataList = xmlDoc.SelectNodes("//w3org:div[@data-gig_id]", m);

就可以了。

2.后来也看到官网的解释了:

XmlNode.SelectNodes Method (String, XmlNamespaceManager)

 

【总结】

对于本身html带xmlns的,转换为xml后,使用SelectNodes或SelectSingleNode去查找其下节点,需要添加对应的XmlNamespaceManager参数,才可以的。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量