You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PHP正则从XML文档提取顶级标签生成有序数组

解决方案

处理Word XML的命名空间节点时,正则匹配容易因嵌套结构或格式问题出错,推荐用PHP的DOM扩展精准处理,以下是可行的实现代码:

<?php
// 替换为你的实际XML字符串变量
$xmlString = '<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
    <w:p>段落内容</w:p>
    <w:tbl>表格内容</w:tbl>
    <w:p>另一段内容</w:p>
</w:document>';

$dom = new DOMDocument();
// 屏蔽XML格式错误提示,避免非标准XML中断执行
libxml_use_internal_errors(true);
$dom->loadXML($xmlString);
libxml_clear_errors();

// 定义Word XML官方命名空间
$wordNs = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main';
$rootNode = $dom->documentElement;
$outputArr = [];

// 遍历根节点的所有子节点
foreach ($rootNode->childNodes as $node) {
    // 仅处理元素节点,跳过空白文本、注释等无效节点
    if ($node->nodeType !== XML_ELEMENT_NODE) {
        continue;
    }

    // 获取不带命名空间前缀的节点名
    $localNodeName = $node->localName;
    switch ($localNodeName) {
        case 'p':
            $outputArr[] = 'a paragraph';
            break;
        case 'tbl':
            $outputArr[] = 'a table';
            break;
        // 可扩展添加其他需要匹配的顶级标签
    }
}

// 输出预期数组
print_r($outputArr);
?>

常见问题排查

  • 未处理命名空间:直接用$node->nodeName会得到带w:前缀的字符串(如w:p),而localName能获取纯净的节点名p,这是之前输出不符的常见原因。
  • 未过滤非元素节点:XML中的空白换行会被解析为文本节点,必须通过nodeType === XML_ELEMENT_NODE筛选有效节点,否则会混入无效内容。
  • 正则匹配的局限性:XML嵌套结构复杂,正则无法精准处理层级关系,容易漏匹配或打乱顺序,优先使用DOM/SimpleXML这类XML专用扩展。

内容的提问来源于stack exchange,提问作者Engin Yilmaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 06:22:42