【问题标题】:How to read XML with tags from a Docx using DOMDocument [duplicate]如何使用 DOMDocument 从 Docx 中读取带有标签的 XML [重复]
【发布时间】:2019-10-15 14:28:39
【问题描述】:

我有这段代码可以读取 Docx 文件的 XML:

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

从这里开始,如何使用DOMDocument对其进行修改?

我的目标是使用 PHP 的原生函数,如果有更好的东西,你能给我解释一下为什么使用其他东西而不是 DOMDocument。?

编辑

为了更好的解释,这里是“完整”的代码:

$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>.

我只需要删除其中一个,但我不知道如何捕获我需要的那个。

【问题讨论】:

  • 我认为这更像是您打算从文档中提取的内容,有时您可以使用 DOMDocument 阅读它的事实并不意味着它是一个可行的选择。
  • 我知道,这就是为什么我需要知道是否有更好的选择。我只需要读取一个 XML 文档,删除一些节点并保存所有完成的工作,但似乎它不适用于 DOMDocument。
  • 您能否提供一段更完整的代码来显示您正在尝试做什么以及什么不起作用。应该没有理由让它不工作(据我所知到目前为止的最小细节)。

标签: php xml domdocument docx ziparchive


【解决方案1】:

如果您扩展目前的代码,您可以看到如何找到各种文本。您必须使用新的 DOMXpath 对象注册命名空间 w,然后您可以使用 //w:t 搜索文档中(在这种情况下)为 &lt;w:t&gt; 的任何元素。

此代码仅循环它们并显示值,但不确定您要对内容做什么...

$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();

【讨论】:

  • 非常感谢。我需要搜索一些节点并删除它们,但我尝试在 $xmlText 上使用 preg_replace 和一些正则表达式,它可以工作。
  • 在 XML 中使用正则表达式可能不可靠 - stackoverflow.com/a/1732454/1213708
猜你喜欢
  • 2021-12-14
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 2014-06-30
相关资源
最近更新 更多