2011-05-13 104 views
2

我有一堆XML文件以及DTD,每個文件都有一個<TEXT>部分。爲TEXT元素的DTD如下:如何從Java中的XML文件提取所有PCDATA(文本)?

<!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> 

最後,我想提取

我要提取的一些文字 部分文字 代理機構 Bob Smith

但是,每個<TEXT>塊在元素/排序方面顯然不一樣,或者每走一步都不一樣。有沒有在Java中使用DOM的方法,我可以做到這一點?我更喜歡在SAX上使用DOM,但如果使用SAX更容易,那就這樣吧。

在此先感謝

回答

2

XSLT樣式表將工作:

更新#2:我懷疑這會因爲你實際使用SGML,而不是XML爲你工作。放棄是你在你的問題中的元素聲明有標籤最小化,這在XML中是不允許的。

更新:修改了XML輸入和XSLT以僅顯示<TEXT>結構中的文本。

XML輸入

<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」更改爲select="normalize-space(//TEXT)"

+0

你說得對,它是SGML,但到目前爲止它已經是XML兼容的 – neptune 2011-05-13 11:02:13

2

我不是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(); 
    } 

} 
+0

我想我會採用這種方法。薩克斯演員必須是自己的班級嗎?或者我可以簡單地擴展我的主要方法的父類? – neptune 2011-05-13 11:07:46

+0

您可以擴展父類,但我不認爲它是一種新方法。如果您不想爲此製作特定的課程,則可以使用匿名課程。 – 2011-05-16 13:49:49

相關問題