我有一堆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要容易得多,那么就这样吧。
提前致谢
答案 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)"
。