【已解决】查找C#的XmlNode的当前节点下的某个子节点

【问题】

折腾:

【记录】C#中的HTML解析

过程中,需要针对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 Syntax

去写XPath去查找。

2.后来是参考了:

Xml让人郁闷的SelectNodes方法

而知道有个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时,加上".",就表示从当前节点开始查找,

即查找当前节点其下的子节点,就可以找到所要的,当前节点下面的某个子节点,而不是根节点其下的所有的符合条件的子节点了。



发表评论

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

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