Index: src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFSDT.java =================================================================== --- src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFSDT.java (revision 1879153) +++ src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFSDT.java (working copy) @@ -29,6 +29,17 @@ import org.junit.Test; public final class TestXWPFSDT { + + /** + * Test text extraction from nested SDTs + */ + @Test + public void testNestedSDTs() throws Exception { + try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("Bug64561.docx")) { + XWPFAbstractSDT sdt = extractAllSDTs(doc).get(0); + assertEquals("extracted text", "Subject", sdt.getContent().getText()); + } + } /** * Test simple tag and title extraction from SDT Index: src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTContent.java =================================================================== --- src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTContent.java (revision 1879153) +++ src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTContent.java (working copy) @@ -26,6 +26,7 @@ import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtBlock; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtContentBlock; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtContentRun; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSdtRun; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl; /** @@ -50,11 +51,19 @@ if (sdtRun == null) { return; } - for (CTR ctr : sdtRun.getRArray()) { - XWPFRun run = new XWPFRun(ctr, parent); - // runs.add(run); - bodyElements.add(run); + XmlCursor cursor = sdtRun.newCursor(); + cursor.selectPath("./*"); + while (cursor.toNextSelection()) { + XmlObject o = cursor.getObject(); + if (o instanceof CTR) { + XWPFRun run = new XWPFRun((CTR) o, parent); + bodyElements.add(run); + } else if (o instanceof CTSdtRun) { + XWPFSDT c = new XWPFSDT(((CTSdtRun) o), part); + bodyElements.add(c); + } } + cursor.dispose(); } public XWPFSDTContent(CTSdtContentBlock block, IBody part, IRunBody parent) {