【问题标题】:Unable to find tbl child nodes in MS Word doc using xpath or $node->children()无法使用 xpath 或 $node->children() 在 MS Word 文档中找到 tbl 子节点
【发布时间】:2016-12-20 11:51:00
【问题描述】:

我有一个项目,我试图获取一个 docx 文件,然后将其解压缩,然后使用 xpath 运行 document.xml 文件以查找所有表格元素。然后在每个表格元素中运行并使用 tblCaption(显然是表格标题)属性识别特定表格,然后遍历表格并找到表格单元格。然后我将通过使用字符串替换更改 w:fill 值来更改单元格的背景颜色。我们这样做是因为我们想手动将表格输入 Word,然后更改表格,而不必使用 PHPDocx 等库或其他库动态生成表格。到目前为止,我已经使用 SimpleXML 和 xpath 来查找文档中的所有表,遍历它们并测试 tblCaption 节点的存在和值。如果匹配,我将使用单元格文本为每个单元格分配 bg 颜色以标识单元格节点。我可以使用 xpath 找到所有表。我尝试使用 $tblNode->children() 和 $xpath:

来查找每个表的子节点
    $xml =    simplexml_load_file(APPPATH.TEMPLATE_UPLOAD_PATH.'xmltest/word/document.xml');

    $namespaces = $xml->getDocNamespaces(true);
    foreach ($namespaces as $prefix => $ns) {
        $prefix = $prefix  == '' ? 'default' : $prefix;
        $xml->registerXPathNamespace($prefix, $ns);
    }

    $nodes = $xml->xpath("/w:document/w:body//w:tbl");

    foreach($nodes as $node) {
        $children = $node->xpath("/w:tblCaption");
        echo count($children) . '<br />';
        //$children = $node->children();
        //echo count($children) . '<br />';
    }

我最终想使用: $children = $node->xpath("/w:tblCaption[@val='whatever']");仅当 tblCaption 节点存在且具有特定值时才返回它。

目前,每个返回的 tbl 节点都有零个子节点。

有什么想法吗?

【问题讨论】:

    标签: php xml xpath ms-word


    【解决方案1】:

    我可以确定没有优先权查看示例 XML 的问题之一是,您的代码尝试通过使用绝对 XPath 表达式(以 / 开头,它引用根文档)来获取相对于其他元素的元素.您至少应该在 XPath 的开头添加 . 或完全删除 /。两者都将导致 XPath 查找特定名称的子元素,相对于当前 $node :

    foreach($nodes as $node) {
        $children = $node->xpath("w:tblCaption");
        echo count($children) . '<br />';
    }
    

    【讨论】:

      【解决方案2】:

      我已经放弃了这一切,我正在使用 OpenTBS 插件来更改 Word 中的表格外观。它比尝试自己处理 xml 元素要强大得多。我没有尝试过上面的想法。购买谢谢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-11
        • 2017-02-01
        • 2016-01-09
        • 1970-01-01
        • 2017-09-01
        • 2010-12-21
        • 1970-01-01
        相关资源
        最近更新 更多