【问题】
折腾:
过程中,需要针对C#中的XmlNode,查找获得其下某个子节点。
即对于:
<div class="gig-wrapper " data-gig_id="103857" id="gig_id-103857">
<div class="gig-inner">
<div class="gig-image gig-index constrained">
<a href="/fiverrfanatic/be-your-seo-assistant-for-an-hour" class="gig-photo-link" rel="nofollow"><img alt="be your SEO assistant for an hour" height="74" src="http://cdn3.fiverrcdn.com/photos/103857/small/images.jpg?1283183972" width="104" /></a>
</div>
<div class="gig-info">
<div class="gig-info-header">
<div class="gig-title approved">
<h2>
<a href="/fiverrfanatic/be-your-seo-assistant-for-an-hour">I will be your SEO assistant for an hour for $5</a>
</h2>
</div>
...
...
...中,已经获得了
<div class="gig-wrapper "
的节点了。
想要获得其下的
<div class="gig-info-header">
【解决过程】
1.关于XmlNode的SelectSingleNode或SelectNodes,也都知道需要参考:
去写XPath去查找。
2.后来是参考了:
而知道有个descendant,所以去试试:
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);
foreach (XmlNode gigNode in gigDataList)
{
//<div class="gig-title approved">
//XmlNode gitTitleNode = gigNode.SelectSingleNode("//w3org:div[@class='gig-title approved']", m);
//XmlNode gitANode = gitTitleNode.SelectSingleNode("//w3org:a[@href]", m);
//XmlNode gitANode0 = gigNode.SelectSingleNode("descendant::div"); //null
//XmlNode gitANode1 = gigNode.SelectSingleNode("descendant::div", m); //null
//XmlNode gitANode2 = gigNode.SelectSingleNode("w3org:descendant::div", m); // error
XmlNodeList gitChilds = gigNode.ChildNodes;
XmlNode gitInnerNode = gitChilds[0];
}结果也不管用。
因为对于:
XmlNode gitTitleNode = gigNode.SelectSingleNode("//w3org:div[@class='gig-title approved']", m);其是全局查找,所以针对每个gig-wrapper,最后都是找到的第一个。
而不是针对每一个,查找其他的子节点的。
3.对此,虽然也在官网中:
XmlNode.SelectSingleNode Method (String)
找到那个的写法:
book=root.SelectSingleNode("descendant::book[author/last-name='Austen']");
4.后来参考:
XmlNode.SelectSingleNode syntax to search within a node in C#
试试:
XmlNode gitTitleNode = gigNode.SelectSingleNode(".//w3org:div[@class='gig-title approved']", m);结果就可以了。
【总结】
想要查找XmlNode下面的某个节点,注意在写XPath时,加上".",就表示从当前节点开始查找,
即查找当前节点其下的子节点,就可以找到所要的,当前节点下面的某个子节点,而不是根节点其下的所有的符合条件的子节点了。
转载请注明:在路上 » 【已解决】查找C#的XmlNode的当前节点下的某个子节点