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

如何基于语义使用PHP将HTML转换为XML?

HTML到XML语义化转换的PHP实现方案

我来帮你搞定这个基于语义层级的HTML转XML问题,用PHP的话,我们可以借助原生的DOMDocument扩展来解析HTML结构,再根据标题层级(h1→h2)构建对应的XML节点,下面是完整的思路和代码示例:


核心思路

  1. 解析HTML:用DOMDocument加载目标HTML,处理可能的不规范HTML导致的解析警告;
  2. 跟踪层级关系:维护一个节点栈,用来记录当前处于哪个层级的标题节点(比如h1对应根topic,h2对应其子节点sub_topic);
  3. 构建XML结构:遍历HTML节点,将h1/h2转换为带标题属性的XML节点,将段落p转换为对应标题节点下的内容节点;
  4. 输出格式化XML:开启XML的格式化输出,让结果更易读。

完整代码示例

<?php
// 示例输入HTML(你可以替换成实际的HTML内容)
$htmlContent = '<h1>Topic 1</h1> 
<p>Introduction content for Topic 1...</p> 
<h2>Topic 1.1</h2> 
<p>First paragraph under Topic 1.1...</p> 
<p>Second paragraph under Topic 1.1...</p> 
<h2>Topic 1.2</h2> 
<p>Content block for Topic 1.2...</p>';

// 初始化HTML解析器,处理不规范HTML
$htmlDoc = new DOMDocument();
libxml_use_internal_errors(true); // 禁用解析警告
$htmlDoc->loadHTML($htmlContent);
libxml_clear_errors(); // 清空错误缓存

// 初始化XML文档,设置编码和格式化输出
$xmlDoc = new DOMDocument('1.0', 'UTF-8');
$xmlDoc->formatOutput = true;

// 节点栈:跟踪当前所在的XML层级节点
$nodeStack = [];

// 遍历HTML的body子节点(所有内容节点)
$body = $htmlDoc->getElementsByTagName('body')->item(0);
foreach ($body->childNodes as $htmlNode) {
    // 跳过非元素节点(比如空白文本节点)
    if ($htmlNode->nodeType !== XML_ELEMENT_NODE) continue;

    switch ($htmlNode->tagName) {
        case 'h1':
            // 创建根topic节点,设置title属性
            $topicNode = $xmlDoc->createElement('topic');
            $topicNode->setAttribute('title', trim($htmlNode->nodeValue));
            $xmlDoc->appendChild($topicNode);
            // 更新栈:当前层级为根topic
            $nodeStack = [$topicNode];
            break;
        case 'h2':
            // 确保存在父节点(栈不为空)
            if (!empty($nodeStack)) {
                $subTopicNode = $xmlDoc->createElement('sub_topic');
                $subTopicNode->setAttribute('title', trim($htmlNode->nodeValue));
                // 将子节点添加到当前栈顶的父节点下
                $nodeStack[count($nodeStack)-1]->appendChild($subTopicNode);
                // 更新栈:当前层级为sub_topic
                $nodeStack[] = $subTopicNode;
            }
            break;
        case 'p':
            // 将段落内容转为content节点,添加到当前层级节点下
            if (!empty($nodeStack)) {
                $contentNode = $xmlDoc->createElement('content');
                $contentNode->nodeValue = trim($htmlNode->nodeValue);
                $nodeStack[count($nodeStack)-1]->appendChild($contentNode);
            }
            break;
        // 可扩展:添加h3/h4等层级的处理逻辑
    }
}

// 输出最终XML
echo $xmlDoc->saveXML();
?>

代码说明

  • HTML容错处理:通过libxml_use_internal_errors(true)避免不规范HTML抛出警告,保证解析流程正常;
  • 层级跟踪:$nodeStack数组记录当前的XML节点层级,确保段落能正确归属到对应的标题下;
  • 语义映射:严格按照HTML的标题层级映射XML结构,h1→<topic>,h2→<sub_topic>,p→<content>,完全贴合语义需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:38:19