【问题】
折腾:
过程中,需要针对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的当前节点下的某个子节点