2009-10-25 65 views
0

對於Jericho元素,我試圖找出如何遍歷所有子節點,無論是元素還是純文本。如何使用Jericho HTML解析器遍歷純文本段

現在有Element.getNodeIterator(),但是它引用Element中的所有後代,而不僅僅是第一個後代。

我需要Element.getChildSegments()的等價物。有任何想法嗎?

謝謝

回答

0

所有純文本片段不在任何子元素內,是否正確?

public static Iterator<Segment> directPlainTextChildren(Element elem) { 
    final Iterator<Segment> it = elem.getContent().getNodeIterator(); 
    final List<Segment> results = new LinkedList<Segment>(); 
    final List<Element> children = elem.getChildElements(); 
    while (it.hasNext()) { 
     Segment cur = it.next(); 
     if (!(cur instanceof Tag) && !(cur instanceof CharacterReference)) { 
      for (Element child : children) 
       if (child.contains(cur)) continue; 
      results.add(cur); 
     } 
    } 
    return results.iterator(); 
}

的元素應該有幾個直接兒童和元素::包含(段)方法只是一個簡單的邊界檢查,這樣的表現應該是足夠的。

編輯: 如果你想添加遍歷所有直接兒童片段的能力,它是這樣的:

public static Iterator<Segment> getChildSegments(Element elem) { 
    final Iterator<Segment> it = elem.getContent().getNodeIterator(); 
    final List<Segment> results = new LinkedList<Segment>(); 
    final List<Element> children = elem.getChildElements(); 
    while (it.hasNext()) { 
     Segment cur = it.next(); 
     if (cur instanceof CharacterReference) 
      results.add(cur); 
     else if (cur instanceof Tag) { 
      if (cur instanceof StartTag) 
       results.add(((StartTag)cur).getElement()); 
     } 
     else { 
      for (Element child : children) 
       if (child.contains(cur)) continue; 
      results.add(cur); 
     } 
    } 
    return results.iterator(); 
}
+0

哇 - 這看起來不錯,感謝您的幫助。在我出去的路上,我會在早上嘗試。另外 - 感謝接受答案的提示 - 我也會對其進行分類。乾杯r。 – 2009-10-25 18:37:36

+0

我已經修改了您的建議解決方案以包含第一個後裔非文本。感謝您的幫助 – 2009-10-26 13:55:16

0

使用從上面Gunslinger47的方法,以下命令返回即時(第一後裔)子元素elem:

public static List<Segment> getChildSegments(Element elem) { 

    final Iterator<Segment> it = elem.getContent().getNodeIterator(); 
    final List<Segment> results = new LinkedList<Segment>(); 
    final List<Element> children = elem.getChildElements(); 

    while (it.hasNext()) { 
     Segment cur = it.next(); 
     if (!(cur instanceof Tag) && !(cur instanceof CharacterReference) && !cur.isWhiteSpace()) { 
      boolean enclosed = false; 
      for (Element child : children) { 
       if (child.encloses(cur)) { 
        enclosed = true; 
       } 
      } 
      if (!enclosed) results.add(cur); 
     } else { 
      for (Element child : children) { 
       if (child.getStartTag().equals(cur)) { 
        results.add(cur); 
        break; 
       } 
      } 
     } 
    } 
    return results; 
} 
+0

我更新了我的原始答案,以顯示如何整合上述建議。 – Gunslinger47 2009-10-26 14:20:11