这是我的问题:我需要使用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.
答案 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
个活动中的startElement
和Pop
个活动中的endElement
。
或者,如果这对您不起作用,只需Push
进入所有事件的堆栈,然后逐个endOfDocument
,Pop
元素。将数据从</p>
反向存储到<p>
。