使用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
相关产品推荐
相关产品推荐

