如何从Java中的XML文件中提取所有PCDATA(文本)?

时间:2011-05-13 09:26:23

标签: java xml xml-parsing

我有一堆XML文件和DTD,每个文件都有一个<TEXT>部分。 TEXT元素的DTD如下所示:

<!ELEMENT TEXT - - (AGENCY* | ACTION* | SUMMARY* | DATE* | FOOTNAME* | FURTHER* | SIGNER* | SIGNJOB* | FRFILING* | BILLING* | FOOTNOTE* | FOOTCITE* | TABLE* | ADDRESS* | IMPORT* | #PCDATA)+ >

以下是XML文件的示例:

<ROOT>
  ...
  <TEXT>
  Some text that I want to extract
  <SUMMARY> Some more text </SUMMARY>
  <AGENCY> 
     An agency
     <SIGNER> Bob Smith </SIGNER>
  </AGENCY>
  </TEXT>
  ...
</ROOT>

最后,我想提取

  

我要提取的一些文字   还有一些文字   一个机构   鲍勃史密斯

但是,每个<TEXT>块在元素/排序方面明显不一样,或者你走了多远。有没有一种方法在Java中使用DOM我可以做到这一点?我更喜欢使用DOM而不是SAX,但是如果使用SAX要容易得多,那么就这样吧。

提前致谢

2 个答案:

答案 0 :(得分:2)

我不是SAX的忠实粉丝,但为此,我认为它会很好用。

只需定义一个sax处理程序,但只使用characters方法。然后只需将收到的字符放在StringBuilder中即可。

public class textExtractor extends DefaultHandler {

  private StringBuilder sb = new StringBuilder();

  public void characters(char[] ch, int start, int length){
    for (int i=0; i<length; i++){
      sb.append(ch[i]);
    }
  }

  public String getText(){
    return sb.toString();
  }

}

答案 1 :(得分:2)

XSLT样式表可行:

UPDATE#2:我怀疑这对你有用,因为你实际上使用的是SGML而不是XML。赠品是您的问题中的元素声明具有标记最小化,这在XML中是不允许的。

更新:修改XML输入和XSLT以仅显示<TEXT>结构中的文本。

XML INPUT

<ROOT>
  <IGNORE>ignore this data</IGNORE>
  <TEXT>
    Some text that I want to extract
    <SUMMARY> Some more text </SUMMARY>
    <AGENCY> 
      An agency
      <SIGNER> Bob Smith </SIGNER>
    </AGENCY>
  </TEXT>
  <IGNORE>ignore this data</IGNORE>
</ROOT>

<强> XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:value-of select="normalize-space(/ROOT/TEXT)"/>
  </xsl:template>

</xsl:stylesheet>

<强>输出

  

我要提取的一些文字有些   更多文章一个机构Bob Smith

注意:只有当TEXT是ROOT的子级时,此XSLT才有效。如果TEXT可能嵌套得更深,您可以将“选择”更改为select="normalize-space(//TEXT)"