读取xml文件,修改值/添加元素/属性并保存xml如何?

Sli*_*Boy 7 javascript xml

使用javascript,我想从磁盘读取xml文件,修改值/添加元素/属性并将xml保存回磁盘.

任何人都知道我可以找到适用于IE和Firefox的示例吗?我已经找到了要阅读的例子,现在正在改变值,这就是问题所在.

谢谢

Wat*_*oll 1

假设您尝试从浏览器而不是 Node.js 读取和写入磁盘,第一步是使用inputtype 标签file来访问文件系统。

<!DOCTYPE html>
<head>
  <meta charset="UTF-8">
</head>
<body>
  <input type="file" id="input" accept="text/xml">
  <script src="script.js"></script>
</body>
Run Code Online (Sandbox Code Playgroud)

一旦选择了文件,我们就想从元素中提取 blob。这样做的好时机是在变革事件期间。

const input = document.querySelector('#input');

input.addEventListener('change', () => {
  const file = input.files.item(0);
});
Run Code Online (Sandbox Code Playgroud)

将 blob 解析为元素树的方法不止一种。这里我利用了浏览器在HTTP请求中解析xml文档这一事实。

function blobToDocument(blob, callback) {
  const url = URL.createObjectURL(blob);
  const request = new XMLHttpRequest();
  request.open('Get', url);
  request.responseType = 'document';
  request.addEventListener('load', () => {
    callback(request.response);
  });
  request.send();
}
Run Code Online (Sandbox Code Playgroud)

解析 blob 后,我们可以像操作 DOM 树一样操作它。

function editDocument(document) {
  const element = document.createElement('editor');
  element.textContent = 'JavaScript';
  document.firstChild.appendChild(element);
  return document;
}
Run Code Online (Sandbox Code Playgroud)

为了将文件保存到磁盘,我们需要逆向解析过程,将元素树转换回字符串。

function documentToString(document) {
  const serializer = new XMLSerializer();
  return serializer.serializeToString(document);
}
Run Code Online (Sandbox Code Playgroud)

剩下的唯一事情就是将文件发送回磁盘。为了实现这一点,我们可以在包含修改后的文件的链接上触发单击事件。

function download(string, mime) {
  const blob = new Blob([string], { type: mime });
  const a = document.createElement('a');
  const url = URL.createObjectURL(blob);
  a.href = url;
  a.download = 'document.xml';
  a.click();
}
Run Code Online (Sandbox Code Playgroud)

这是完整的代码

<!DOCTYPE html>
<head>
  <meta charset="UTF-8">
</head>
<body>
  <input type="file" id="input" accept="text/xml">
  <script src="script.js"></script>
</body>
Run Code Online (Sandbox Code Playgroud)
const input = document.querySelector('#input');

input.addEventListener('change', () => {
  const file = input.files.item(0);
});
Run Code Online (Sandbox Code Playgroud)