對於Jericho元素,我試圖找出如何遍歷所有子節點,無論是元素還是純文本。如何使用Jericho HTML解析器遍歷純文本段
現在有Element.getNodeIterator(),但是它引用Element中的所有後代,而不僅僅是第一個後代。
我需要Element.getChildSegments()的等價物。有任何想法嗎?
謝謝
對於Jericho元素,我試圖找出如何遍歷所有子節點,無論是元素還是純文本。如何使用Jericho HTML解析器遍歷純文本段
現在有Element.getNodeIterator(),但是它引用Element中的所有後代,而不僅僅是第一個後代。
我需要Element.getChildSegments()的等價物。有任何想法嗎?
謝謝
所有純文本片段不在任何子元素內,是否正確?
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();
}
使用從上面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;
}
我更新了我的原始答案,以顯示如何整合上述建議。 – Gunslinger47 2009-10-26 14:20:11
哇 - 這看起來不錯,感謝您的幫助。在我出去的路上,我會在早上嘗試。另外 - 感謝接受答案的提示 - 我也會對其進行分類。乾杯r。 – 2009-10-25 18:37:36
我已經修改了您的建議解決方案以包含第一個後裔非文本。感謝您的幫助 – 2009-10-26 13:55:16