SAX Parser - 在标签内提取字符串

时间:2014-01-05 18:14:36

标签: java xml parsing saxparser

这是我的问题:我需要使用SAX Parser在没有XML表示法的标记“p”之间提取文本

    <title>1. Introduction</title>
    <p>The Lorem ipsum 
           <xref ref-type="bibr" rid="B1">
                1
           </xref>. 
           Lorem ipsum 23.
     </p>
     <p>The L domain recruits an ATP-requiring cellular factor for this 
           scission event, the only known energy-dependent step in assembly 
           <xref ref-type="bibr" rid="B2">
                2
           </xref>. 
           Domain is used here to denote the amino 
           acid sequence that constitutes the biological function.
     </p>

是否可以使用endElement()?因为当我使用它时,我只获得“/xref”标签

之后的部分

这里是代码

public void endElement(String s, String s1, String element) throws SAXException {

        if(element.equals(Finals.PARAGRAPH)){
            Paragraph paragraph = new Paragraph();
            paragraph.setContext(tmpValue);
            System.out.println("Contesto: " + tmpValue);
            listP.add(paragraph);

        }
    }
    @Override
    public void characters(char[] ac, int i, int j) throws SAXException {
        tmpValue = new String(ac, i, j);

    }

这是我期望做的:包含两段的列表listP

1) Lorem ipsum 1 Lorem ipsum 23.
2) The L domain recruits an ATP-requiring cellular factor for this 
       scission event, the only known energy-dependent step in assembly 2 
       Domain is used here to denote the amino 
       acid sequence that constitutes the biological function.

3 个答案:

答案 0 :(得分:2)

我不确定你的意思是“是否可以使用endElement”,但它肯定是可能的。您需要编写SAX应用程序,以便:

(1)忽略startElement aragraph - 简单状态跟踪之间的所有endElement / <p>事件,或者您可以简单地说您对此不感兴趣除了段落之外的元素,并使你的元素事件处理程序成为你不关心的任何事情的无操作。

(2)累积单独传递的characters()个事件,直至endElement aragraph的<p>。但是你还是需要这样做,因为SAX 总是保留以几个characters()调用的形式提供连续文本的权利,原因与解析器缓冲区管理有关。

答案 1 :(得分:0)

有许多可能的解决方案。通常使用SAX解析器,您只需添加一些布尔标志来表示解析时的某些特定状态。在这个简单的例子中,您可以通过更改它来实现此目的:

tmpValue = new String(ac, i, j);

到此:

if (tmpValue.equals(""))
    tmpValue = new String(ac, i, j);
else
    tmpValue += new String(ac, i, j);

或:

if (tmpValue == null)
    tmpValue = new String(ac, i, j);
else
    tmpValue += new String(ac, i, j);

取决于您初始化tmpValue变量的方式(如果您尚未执行此操作,则应初始化它)。

收集您需要的所有段落的内容:

public void endElement(String s, String s1, String element) throws SAXException {

    if (element.equals(Finals.PARAGRAPH)) {
        Paragraph paragraph = new Paragraph();
        paragraph.setContext(tmpValue);
        System.out.println("Contesto: " + tmpValue);
        listP.add(paragraph);
        tmpValue = ""; // or tmpValue = null; for the second version
    }
}

并省略标题部分:

public void startElement(
    String uri,
    String localName,
    String qName,
    Attributes atts) {

    if (localName.equals(Finals.PARAGRAPH)) {
        tmpValue = ""; // or tmpValue = null; for the second version
    }
}

答案 2 :(得分:0)

使用stack
Push个活动中的startElementPop个活动中的endElement

或者,如果这对您不起作用,只需Push进入所有事件的堆栈,然后逐个endOfDocumentPop元素。将数据从</p>反向存储到<p>