Как читать XML с тегами из Docx, используя DOMDocument - PullRequest
0 голосов
/ 15 октября 2019

У меня есть этот код, который читает XML-файл Docx:

$zip = new ZipArchive;
$zip->open($fileName);
$xmlDoc = $zip->getFromName('word/document.xml');

Исходя из этого, как я могу изменить его с помощью DOMDocument?

Моя цель - использовать нативныйфункция PHP, и если есть что-то лучше, вы можете дать мне объяснение, почему использовать что-то еще вместо DOMDocument .?

EDIT

Для лучшего объяснения,вот «полный» код:

$zip = new ZipArchive;
$zip->open("MyFile.docx");
if (($index = $zip->locateName("word/document.xml")) !== false) {
    $text = $zip->getFromIndex($index);
    $xml = DOMDocument::loadXML($text, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
    $xmlText = $xml->saveXML();
}
$zip->close();

Теперь мне нужно удалить некоторые узлы, но файл был изменен с помощью PHPWord и в нем полно

<w:t>First text</w:t> <w:t>Second text</w:t> <w:t>Third text</w:t>.

Мне нужно удалить только один из них, но я не знаю, как поймать тот, который мне нужен.

1 Ответ

0 голосов
/ 15 октября 2019

Если вы расширите код, который у вас есть, вы увидите, как найти различные фрагменты текста. Вы должны зарегистрировать пространство имен w с новым объектом DOMXpath, а затем вы можете искать любой элемент в документе, который (в данном случае) имеет значение <w:t>, используя //w:t.

. Этот код только проходит через нихи отображает значения, но не уверен, что вы хотите сделать с содержанием ...

$zip = new ZipArchive;
$zip->open("text.docx");
if (($index = $zip->locateName("word/document.xml")) !== false) {
    $text = $zip->getFromIndex($index);
    $xml = new DOMDocument();

    $xml->loadXML($text, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
    $xmlText = $xml->saveXML();

    $xp = new DOMXPath($xml);
    // Register main namespace (w)
    $xp->registerNamespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");

    // Search for <w:t> elements
    $text = $xp->query("//w:t");
    foreach ($text as $entry)   {
        echo $entry->textContent.PHP_EOL;
    }
}
$zip->close();
...