XML 与 JSON 实现 互转

  1. 将 XML 转换为 JSON:不需要更改,已经在前面的代码中完成。

  2. 将 JSON 转换为 XML:在此步骤中,XMLBuilder 生成 XML 后,你可以进一步处理以满足格式要求。

  3. 后处理 XML:编写一个函数来替换换行符和多余的空格,确保换行符是 \r\n,并且每个节点后都有一个换行符。

以下是处理过程的详细代码:

import { XMLParser, XMLBuilder } from 'fast-xml-parser';

// 将 XML 转换为 JSON
export async function convertXmlToJson(xml: string): Promise<any> {
  try {
    const parser = new XMLParser({
      ignoreAttributes: false, // 是否忽略属性
      attributeNamePrefix: "@_", // 属性名前缀
    });
    const parsedXML = parser.parse(xml);
    return parsedXML;
  } catch (err) {
    console.error("解析 XML 时出错:", err);
    throw err; // 抛出错误以便调用者处理
  }
}

// 将 JSON 转换为 XML
export function convertJsonToXml(jsonObj: object): string {
  try {
    const builder = new XMLBuilder({
      ignoreAttributes: false,
      attributeNamePrefix: "@_",
      format: false, // 不格式化,以便后续处理
      suppressEmptyNode: true, // 去除空节点
    });
    const rawXml = builder.build(jsonObj);
    return formatXml(rawXml);
  } catch (err) {
    console.error("生成 XML 时出错:", err);
    return "";
  }
}

// 格式化 XML,确保每个节点后都包含 \r\n
function formatXml(xml: string): string {
  // 将换行符替换为 \r\n
  xml = xml.replace(/\n/g, '\r\n');
  // 移除连续的空白字符,只保留一个空格
  xml = xml.replace(/\s{2,}/g, ' ');
  // 确保每个节点后有一个 \r\n
  xml = xml.replace(/>(?!<\/)/g, '>\r\n');
  // 删除结尾的多余 \r\n
  return xml.replace(/(\r\n)+$/, '');
}

解释:

  1. convertXmlToJson

    • 将 XML 转换为 JSON 的函数保持不变。
  2. convertJsonToXml

    • 使用 XMLBuilder 构建 XML。
    • 调用 formatXml 函数来进一步处理生成的 XML。
  3. formatXml

    • 将所有的换行符 \n 替换为 \r\n
    • 使用正则表达式移除多余的空白字符,只保留一个空格。
    • 确保每个节点后面都有一个 \r\n(但不会在闭合标签如 后面添加)。
    • 删除 XML 末尾的多余 \r\n

示例:

假设你使用了上述代码,调用 convertJsonToXml 函数将生成如下格式的 XML(这只是示例,实际结果可能因输入 JSON 的复杂性而异):


<ThermometryScene version="2.0" xmlns="http://www.isapi.org/ver20/XMLSchema">
  <id>1id>
  <normalizedScreenSize>
    <normalizedScreenWidth>1000normalizedScreenWidth>
    <normalizedScreenHeight>1000normalizedScreenHeight>
  normalizedScreenSize>
  <ThermometryRegionList>
    <ThermometryRegion>
      <id>1id>
      <enabled>trueenabled>
      <name>ID:1name>
      <emissivity>0.99emissivity>
      <distance>400distance>
      <reflectiveEnable>falsereflectiveEnable>
      <reflectiveTemperature>20.0reflectiveTemperature>
      <type>pointtype>
      <Point>
        <CalibratingCoordinates>
          <positionX>390positionX>
          <positionY>507positionY>
        CalibratingCoordinates>
      Point>
      <distanceUnit>centimeterdistanceUnit>
      <emissivityMode>customsettingsemissivityMode>
    ThermometryRegion>
    
  ThermometryRegionList>
ThermometryScene>

这样处理后,XML 文件将使用 \r\n 作为换行符,并且每个节点后都保持一致的换行符。

你可能感兴趣的:(xml,json)