我有一堆 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>
最后我要提取
Some text that I want to extract Some more text An agency Bob Smith
但是,每个<TEXT>
block 显然在元素/顺序或向下走多远方面不一样。 Java 有没有办法使用 DOM 来做到这一点?我更喜欢使用 DOM 而不是 SAX,但如果使用 SAX 更容易,那就这样吧。
提前致谢
最佳答案
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>
输出
Some text that I want to extract Some more text An agency Bob Smith
注意:此 XSLT 仅当 TEXT 是 ROOT 的子级时才有效。如果 TEXT 可能嵌套得更深,您可以将“select”更改为 select="normalize-space(//TEXT)"
.
关于java - 如何从 Java 中的 XML 文件中提取所有 PCDATA(文本)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5989858/