w:t不是org.docx4j.wml.Text的实例吗?

时间:2019-06-13 11:49:12

标签: docx4j wordml

我想使用docx4j从DOCX文件中提取所有粗体文本,但使用以下代码得到类强制转换异常:

import java.util.List;
import javax.xml.bind.JAXBException;
import org.docx4j.Docx4J;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.wml.Text;

public class Main
{
    public static void main(String[] args) throws Docx4JException, JAXBException
    {
        var wordMLPackage = Docx4J.load(new java.io.File("input.docx"));
        var doc = wordMLPackage.getMainDocumentPart();
        System.out.println((Text)doc.getJAXBNodesViaXPath("//w:r[w:rPr/w:b]/w:t", false).get(0));
    }
}

错误是:

  

线程“主”中的异常java.lang.ClassCastException:类   javax.xml.bind.JAXBElement无法转换为org.docx4j.wml.Text类   (未命名的javax.xml.bind.JAXBElement和org.docx4j.wml.Text   加载程序“ app”的模块)位于Main.main(Main.java:37)

为什么出现“ w:t”不是org.docx4j.wml.Text的实例,以及我如何获取文本呢?

1 个答案:

答案 0 :(得分:0)

显然,我尝试过的方式仅适用于R(运行)元素,文本节点似乎进一步嵌套。我可以提取文本如下:

System.out.println( ((JAXBElement<Text>)doc.getJAXBNodesViaXPath("//w:r[w:rPr/w:b]/w:t", false) .get(0)).getValue().getValue());