Java 如何使用Jericho HTML解析器迭代纯文本段

Java 如何使用Jericho HTML解析器迭代纯文本段,java,parsing,text,Java,Parsing,Text,对于Jericho元素,我试图找出如何在所有子节点上循环,无论是元素还是纯文本 现在有了Element.getNodeIterator(),但它引用元素中的所有子体,而不仅仅是第一个子体 我需要元素的等效项。getChildSegments()。有什么想法吗 谢谢所有纯文本段不在任何子元素中,对吗 public static Iterator<Segment> directPlainTextChildren(Element elem) { final Iterator<Seg

对于Jericho元素,我试图找出如何在所有子节点上循环,无论是元素还是纯文本

现在有了Element.getNodeIterator(),但它引用元素中的所有子体,而不仅仅是第一个子体

我需要元素的等效项。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();
}
公共静态迭代器directPlainTextChildren(元素elem){
最终迭代器it=elem.getContent().getNodeIterator();
最终列表结果=新建LinkedList();
最终列表子元素=elem.getChildElements();
while(it.hasNext()){
段cur=it.next();
if(!(cur instanceof Tag)和&!(cur instanceof CharacterReference)){
for(元素子元素:子元素)
if(child.contains(cur))继续;
结果:添加(cur);
}
}
返回结果。迭代器();
}
一个元素应该有几个直接子元素,而element::contains(Segment)方法只是一个简单的边界检查,因此性能应该足够

编辑: 如果您想添加迭代所有直接子段的功能,它将如下所示:

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();
}
公共静态迭代器getChildSegments(元素elem){
最终迭代器it=elem.getContent().getNodeIterator();
最终列表结果=新建LinkedList();
最终列表子元素=elem.getChildElements();
while(it.hasNext()){
段cur=it.next();
if(字符引用的当前实例)
结果:添加(cur);
else if(cur instanceof标签){
if(当前StartTag实例)
添加(((StartTag)cur.getElement());
}
否则{
for(元素子元素:子元素)
if(child.contains(cur))继续;
结果:添加(cur);
}
}
返回结果。迭代器();

}
使用上文Gunslinger47中的方法,以下返回元素元素元素的立即(第一个后代)子段:

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;
}
公共静态列表getChildSegments(元素元素元素){
最终迭代器it=elem.getContent().getNodeIterator();
最终列表结果=新建LinkedList();
最终列表子元素=elem.getChildElements();
while(it.hasNext()){
段cur=it.next();
如果(!(cur instanceof Tag)和&!(cur instanceof CharacterReference)和&!cur.isWhiteSpace()){
布尔值=假;
for(元素子元素:子元素){
if(child.encloses(cur)){
封闭=真;
}
}
如果(!封闭)结果。添加(cur);
}否则{
for(元素子元素:子元素){
if(child.getStartTag().equals(cur)){
结果:添加(cur);
打破
}
}
}
}
返回结果;
}

wow-这看起来很棒,谢谢你的帮助。在我现在出去的路上,明天早上我会试试。另外,谢谢你给我的关于接受答案的建议,我也会整理一下。干杯r。我已经修改了您建议的解决方案,以包括第一代非文本。感谢您的帮助,我更新了我的原始答案,以显示我将如何采纳上述建议。