From: PJ Fanning Date: Fri, 26 Jun 2020 10:15:53 +0000 (+0000) Subject: [bug-64561] XWPFSDTContent.getText() is empty for nested SDT elements X-Git-Tag: before_ooxml_3rd_edition~228 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=06cf5caa2d8691f224185780bb6da886ce368160;p=poi.git [bug-64561] XWPFSDTContent.getText() is empty for nested SDT elements git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1879223 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTContent.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTContent.java index f39c5cf482..eaaf94d873 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTContent.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFSDTContent.java @@ -21,12 +21,7 @@ import java.util.List; import org.apache.xmlbeans.XmlCursor; import org.apache.xmlbeans.XmlObject; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR; -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.CTTbl; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.*; /** * Experimental class to offer rudimentary read-only processing of @@ -50,11 +45,19 @@ public class XWPFSDTContent implements ISDTContent { 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) { diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFSDT.java b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFSDT.java index 4bf87fcbb0..c1ca100be5 100644 --- a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFSDT.java +++ b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFSDT.java @@ -30,6 +30,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 */ diff --git a/test-data/spreadsheet/Bug64561.docx b/test-data/spreadsheet/Bug64561.docx new file mode 100644 index 0000000000..f34fe701bf Binary files /dev/null and b/test-data/spreadsheet/Bug64561.docx differ