diff --git a/src/PhpWord/Reader/Word2007/Document.php b/src/PhpWord/Reader/Word2007/Document.php index da42bddc9e..5cc3f336c3 100644 --- a/src/PhpWord/Reader/Word2007/Document.php +++ b/src/PhpWord/Reader/Word2007/Document.php @@ -18,6 +18,7 @@ namespace PhpOffice\PhpWord\Reader\Word2007; use DOMElement; +use DOMNode; use PhpOffice\PhpWord\Element\Section; use PhpOffice\PhpWord\PhpWord; use PhpOffice\PhpWord\Shared\XMLReader; @@ -46,15 +47,33 @@ public function read(PhpWord $phpWord): void $this->phpWord = $phpWord; $xmlReader = new XMLReader(); $xmlReader->getDomFromZip($this->docFile, $this->xmlFile); - $readMethods = ['w:p' => 'readWPNode', 'w:tbl' => 'readTable', 'w:sectPr' => 'readWSectPrNode']; - $nodes = $xmlReader->getElements('w:body/*'); if ($nodes->length > 0) { $section = $this->phpWord->addSection(); foreach ($nodes as $node) { - if (isset($readMethods[$node->nodeName])) { - $readMethod = $readMethods[$node->nodeName]; - $this->$readMethod($xmlReader, $node, $section); + $this->readNode($phpWord, $xmlReader, $node, $section); + } + } + } + + private function readNode(PhpWord $phpWord, XMLReader $xmlReader, DOMNode $node, Section $section): void + { + $readMethods = ['w:p' => 'readWPNode', 'w:tbl' => 'readTable', 'w:sectPr' => 'readWSectPrNode']; + if (isset($readMethods[$node->nodeName])) { + $readMethod = $readMethods[$node->nodeName]; + $this->$readMethod($xmlReader, $node, $section); + } elseif ($node->nodeName === 'w:sdt') { + $nodes = $xmlReader->getElements('w:sdtContent/*', $node); + if ($nodes->length > 0) { + foreach ($nodes as $subNode) { + $this->readNode($phpWord, $xmlReader, $subNode, $section); + } + } + } elseif ($node->nodeName === 'w:sdtContent') { + $nodes = $xmlReader->getElements('*', $node); + if ($nodes->length > 0) { + foreach ($nodes as $subNode) { + $this->readNode($phpWord, $xmlReader, $subNode, $section); } } }