52 lines
1.6 KiB
JavaScript
52 lines
1.6 KiB
JavaScript
const xpath = require("xpath");
|
|
const { DOMParser } = require("xmldom");
|
|
const stringSimilarity = require("string-similarity");
|
|
|
|
/**
|
|
* XML 문서에서 유사한 문자열 찾기
|
|
* @param {string} xmlDoc - XML 문자열
|
|
* @param {string} targetString - 비교할 문자열
|
|
* @param {number} threshold - 유사도 기준 (0~1)
|
|
* @returns {string} - 유사한 문자열
|
|
*/
|
|
function findSimilarString(xmlDoc, targetString, threshold = 0.8) {
|
|
// XML 내부의 비교 대상 텍스트 리스트 찾기
|
|
function getTextNodes(xmlDoc, paths = ["//CRCUnitArr/@Name"]) {
|
|
const stringList = [];
|
|
|
|
paths.forEach(path => {
|
|
const nodes = xpath.select(path, xmlDoc);
|
|
nodes.forEach(node => {
|
|
stringList.push(node.value);
|
|
});
|
|
});
|
|
|
|
return stringList;
|
|
}
|
|
|
|
// XML에서 모든 텍스트 추출
|
|
const stringList = getTextNodes(xmlDoc, [
|
|
"//CRCUnitArr/@Name",
|
|
"//Layer/Name/@value",
|
|
]);
|
|
|
|
// 유사도 비교하여 가장 유사한 문자열 찾기
|
|
let bestMatch = null;
|
|
let highestSimilarity = 0;
|
|
|
|
stringList.forEach(text => {
|
|
const similarity = stringSimilarity.compareTwoStrings(targetString, text);
|
|
|
|
// console.log("🚀 ~ findSimilarString ~ text:", text)
|
|
// console.log("🚀 ~ findSimilarString ~ targetString:", targetString)
|
|
// console.log("🚀 ~ findSimilarString ~ similarity:", similarity)
|
|
|
|
if (similarity > highestSimilarity && similarity >= threshold) {
|
|
highestSimilarity = similarity;
|
|
bestMatch = text;
|
|
}
|
|
});
|
|
return bestMatch;
|
|
}
|
|
|
|
module.exports = findSimilarString; |