41 lines
1.4 KiB
JavaScript
41 lines
1.4 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, stringList = []) {
|
|
const stringNodes = xpath.select("//CRCUnitArr/@Name", xmlDoc);
|
|
stringNodes.forEach(stringNode => {
|
|
console.log("🚀 ~ getTextNodes ~ stringNode:", stringNode.value);
|
|
stringList.push(stringNode.value);
|
|
});
|
|
return stringList;
|
|
}
|
|
|
|
// XML에서 모든 텍스트 추출
|
|
const stringList = getTextNodes(xmlDoc);
|
|
|
|
// 유사도 비교하여 가장 유사한 문자열 찾기
|
|
let bestMatch = null;
|
|
let highestSimilarity = 0;
|
|
|
|
stringList.forEach(text => {
|
|
const similarity = stringSimilarity.compareTwoStrings(targetString, text);
|
|
if (similarity > highestSimilarity && similarity >= threshold) {
|
|
highestSimilarity = similarity;
|
|
bestMatch = text;
|
|
}
|
|
});
|
|
|
|
return bestMatch;
|
|
}
|
|
|
|
module.exports = findSimilarString; |