-
将 XML 转换为 JSON:不需要更改,已经在前面的代码中完成。
-
将 JSON 转换为 XML:在此步骤中,XMLBuilder 生成 XML 后,你可以进一步处理以满足格式要求。
-
后处理 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)+$/, '');
}
解释:
-
convertXmlToJson
:- 将 XML 转换为 JSON 的函数保持不变。
-
convertJsonToXml
:- 使用
XMLBuilder
构建 XML。 - 调用
formatXml
函数来进一步处理生成的 XML。
- 使用
-
formatXml
:- 将所有的换行符
\n
替换为\r\n
。 - 使用正则表达式移除多余的空白字符,只保留一个空格。
- 确保每个节点后面都有一个
\r\n
(但不会在闭合标签如</tag>
后面添加)。 - 删除 XML 末尾的多余
\r\n
。
- 将所有的换行符
示例:
假设你使用了上述代码,调用 convertJsonToXml
函数将生成如下格式的 XML(这只是示例,实际结果可能因输入 JSON 的复杂性而异):
<?xml version="1.0" encoding="UTF-8"?>
<ThermometryScene version="2.0" xmlns="http://www.isapi.org/ver20/XMLSchema">
<id>1</id>
<normalizedScreenSize>
<normalizedScreenWidth>1000</normalizedScreenWidth>
<normalizedScreenHeight>1000</normalizedScreenHeight>
</normalizedScreenSize>
<ThermometryRegionList>
<ThermometryRegion>
<id>1</id>
<enabled>true</enabled>
<name>ID:1</name>
<emissivity>0.99</emissivity>
<distance>400</distance>
<reflectiveEnable>false</reflectiveEnable>
<reflectiveTemperature>20.0</reflectiveTemperature>
<type>point</type>
<Point>
<CalibratingCoordinates>
<positionX>390</positionX>
<positionY>507</positionY>
</CalibratingCoordinates>
</Point>
<distanceUnit>centimeter</distanceUnit>
<emissivityMode>customsettings</emissivityMode>
</ThermometryRegion>
<!-- 更多节点 -->
</ThermometryRegionList>
</ThermometryScene>
这样处理后,XML 文件将使用 \r\n
作为换行符,并且每个节点后都保持一致的换行符。