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.7) { // 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;