如题,
主要想请教NodeFilter这个类的两个应用。假如有如下html标签:
<div class=AAA>
...
</div>
则,我们可以通过创建如下NodeFilter对象,提取其间的文本:
NodeFilter filter =
      new AndFilter (
          new TagNameFilter ("div"),
          new HasAttributeFilter("class", "AAA"));我这里想请教,
1. 如果该html标签为:
<div class1=AAA class2=BBB>
...
</div>
即,标签中有两个属性值,
该如何创建相应的NodeFilter对象?2. 对于如下嵌套标签:
<div class=AAA>
  <p src=BBB>
  ...
  </p>
</div>
该如何创建NodeFilter对象,提取其中的文本?谢谢!!

解决方案 »

  1.   


    NodeFilter filter =
         new AndFilter(
          new AndFilter (
              new TagNameFilter ("div"),
              new HasAttributeFilter("class1", "AAA")),new HasAttributeFilter("class2", "BBB")
         );
    //并不是需要所有属性才能取到该节点,只要满足条件就可以取出,NodeFilter filter = new TagNameFilter 
    //("div");可以取出所有div.    
    NodeFilter filter =
          new AndFilter (
              new TagNameFilter ("P"),
              new HasAttributeFilter("src", "BBB"));//这样就可以取到p了,如果只想取到<div class=AAA>下的,就加一个HasParentFilter,和上面的一样.
      

  2.   

    谢谢!对第二个应用,
    之所以需要用嵌套表示,
    是因为,用嵌套表示,才能够将这段文本唯一的表示出来。
    如果只用<p src=BBB>,会有其他的文本也符合这个模板。那该如何表示这样的嵌套呢?
    怎么用HasParentFilter呢?
    谢谢!
      

  3.   


    NodeFilter filter =
         new AndFilter(
          new AndFilter (
              new TagNameFilter ("P"),
              new HasAttributeFilter("src", "BBB")),
          new HasParentFilter(
              new AndFilter (
                  new TagNameFilter ("div "),
                  new HasAttributeFilter("class", "AAA")))
          )
          
         );
      

  4.   

    谢谢!
    我今天试一下。其实,我最终的想法是这样:
    我不想针对每个不同的页面,都写一份相应的解析工具,
    而是想通过配置的方式,告诉程序改如何组织这些NodeFilter等逻辑类。初步的想法是,
    可能需要对NodeFilter的相关类,再按照组合模式等设计模式进行封装,
    来实现我所希望的逻辑的组合。也请大家多提意见。
    谢谢!
      

  5.   

    您好。试了一下您的第一段代码,
    对简单的html标签(就是属性名和属性值的字符长度比较短)能够解析出其中的内容;
    但如果对如下稍微复杂的html标签,就读不出来内容:
    <strong id="ctl00_MainContentPlaceHolder_strongid" class="hotel_goldmedal">
                            北京奥克伍德华庭
                            </strong>
    读到的字符串为空。这是怎么回事呢?