浏览器插件如何捕获页面上的XML并上传

幻夢星雲

幻夢星雲

2026-03-10

961人浏览

原创

xml捕获需区分xhr/fetch响应与dom嵌入两类来源:前者须拦截网络请求并解析响应体,后者应直接提取textcontent;混用方法将导致失败。

浏览器插件如何捕获页面上的xml并上传

XML 捕获必须区分来源:XHR 还是 DOM?

浏览器插件无法“全局监听所有 XML”,必须明确目标来源。常见两类:一是页面通过 fetchXMLHttpRequest 加载的 XML 响应(如 RSS、SOAP 接口);二是页面 DOM 中已存在的 <?xml> 声明或 <root><item>...</item></root> 结构。前者需拦截网络请求,后者可直接查询 DOM —— 方法完全不同,混用会导致捕获失败。

  • DOM 中的 XML 通常只是普通 HTML 元素(如 <pre class="brush:php;toolbar:false;"></pre> 里放的 XML 字符串),没有解析为 XML 文档对象,不能用 responseXML
  • XHR/fetch 的 XML 响应,只有在 responseType === 'document' 或服务端返回 Content-Type: application/xml 且浏览器自动解析时,才可能拿到 responseXML
  • 现代 fetch 默认不解析 XML,response.text() 是最稳妥的获取原始 XML 字符串方式

拦截 XHR/fetch 并提取 XML 响应体

需在 content script 中重写原生方法,捕获响应内容。注意:fetch 拦截比 XHR 更复杂,因它是 Promise 驱动,需包装 response.clone() 避免 body 被读取多次。

const originalFetch = window.fetch;
window.fetch = function(...args) {
  return originalFetch(...args).then(response => {
    // 只处理明确返回 XML 的响应
    const contentType = response.headers.get('content-type');
    if (contentType && /application\/xml|text\/xml/i.test(contentType)) {
      const cloned = response.clone();
      cloned.text().then(xmlStr => {
        // 此处发送 XML 字符串到后台脚本或上传接口
        chrome.runtime.sendMessage({
          type: 'xml-captured',
          url: response.url,
          xml: xmlStr.slice(0, 102400) // 限制长度防爆内存
        });
      }).catch(() => {});
    }
    return response;
  });
};
  • 不要在 fetch 拦截中直接调用 response.text() 后返回新 Response —— 会破坏原始响应流
  • chrome.runtime.sendMessage 需在 manifest.json 中声明 "externally_connectable" 或仅用于内部通信
  • 部分站点使用 blob: URL 或 Service Worker 拦截请求,此时 content script 无法捕获,需改用 webRequest API(需 "webRequest" 权限和 "host_permissions"

从 DOM 提取 XML 字符串的可靠方式

当 XML 以文本形式嵌入 HTML(如 <script type="application/xml"></script><pre class="xml"></pre>、或注释节点),用 textContent 最安全。避免用 innerHTML,防止误解析标签。

Comet AI 浏览器
Comet AI 浏览器

下载 Comet AI 浏览器,体验由 Perplexity AI 驱动的革命性上网方式。内置 AI 助手可实时总结网页、跨标签页对比信息、自动执行任务。告别繁琐操作,让 AI 成为你的浏览副驾,大幅提升研究与工作效率。支持 Windows、macOS、Android 和 iOS。

下载
// 匹配常见的 XML 容器
const xmlCandidates = [
  'script[type="application/xml"]',
  'script[type="text/xml"]',
  'pre.xml',
  'code.xml',
  'textarea[lang="xml"]'
].map(sel => document.querySelectorAll(sel)).flat();

xmlCandidates.forEach(el => {
  let xmlStr = el.textContent.trim();
  // 简单校验:开头是否含 <?xml 或 <root 类似结构
  if (/^<\?xml\s|^\s*<\w+[\s>]/.test(xmlStr)) {
    chrome.runtime.sendMessage({
      type: 'xml-from-dom',
      selector: el.outerHTML.substring(0, 50),
      xml: xmlStr.slice(0, 102400)
    });
  }
});
  • DOM 提取无法捕获动态生成的 XML(如 JS 拼接后写入 innerHTML 但未挂载到文档)
  • 若 XML 被压缩成一行且无换行,正则 /^ 仍有效;但纯二进制 XML(如 gzip 压缩)无法通过 DOM 提取
  • 注意 CSP 限制:某些站点禁止内联脚本执行,需将逻辑注入到 run_at: "document_idle" 的 content script

上传前必须处理的三个实际问题

直接 fetch(uploadUrl, { method: 'POST', body: xmlStr }) 很容易失败。真实环境中需确认以下三点:

  • 服务端是否要求 Content-Type: application/xml?还是接受 text/plain 或表单字段?不匹配会返回 400
  • XML 字符串是否含非法控制字符(如 \u0000–\u0008)?上传前建议用 xmlStr.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '') 清理
  • 跨域上传时,若服务端未设置 Access-Control-Allow-Origin,需走 background script 中转(background 不受 CORS 限制)

最易被忽略的是编码一致性:XML 声明中的 encoding="GBK" 和实际传输字节不匹配,会导致服务端解析乱码。插件中统一用 UTF-8 处理和上传,除非服务端明确要求其他编码。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

浏览器

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

1559

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

1425

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

588

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

1314

7

chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1974

5

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.06

2410

7

Chrome开启无痕模式
Chrome开启无痕模式

本专题整合了Chrome无痕模式开启相关内容,阅读专题下面的文章了解更多详细教程。

2026.03.24

2057

22

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.01

2807

5

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2024.08.01

3384

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpMyAdmin 常见问题
phpMyAdmin 常见问题

共0课时 | 0人学习

uni-app快速上手
uni-app快速上手

共0课时 | 0人学习