{"id":51,"date":"2026-06-25T07:39:20","date_gmt":"2026-06-25T07:39:20","guid":{"rendered":"https:\/\/toolskit.site\/index.php\/xml-sitemap-validator\/"},"modified":"2026-06-25T07:39:20","modified_gmt":"2026-06-25T07:39:20","slug":"xml-sitemap-validator","status":"publish","type":"page","link":"https:\/\/toolskit.site\/index.php\/xml-sitemap-validator\/","title":{"rendered":"XML Sitemap Validator"},"content":{"rendered":"<div class=\"hth-single-tool-shell\" style=\"--hth-color:#00ff88\">\n<div id=\"xsv-wrapper\">\n<style>\n    #xsv-wrapper * { box-sizing: border-box; margin: 0; padding: 0; font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif; }\n    #xsv-wrapper { background: radial-gradient(circle at 80% 10%, #1a1a2e 0%, #0f0f1a 40%, #05050a 100%); color: #e0e0e0; padding: 24px; border-radius: 16px; border: 1px solid rgba(0, 255, 136, 0.15); box-shadow: 0 0 30px rgba(0, 255, 136, 0.05), inset 0 0 60px rgba(0,0,0,0.3); position: relative; overflow: hidden; max-width: 1200px; margin: 0 auto; }\n    #xsv-wrapper::before { content: \"\"; position: absolute; top: -50%; left: -50%; width: 200%; height: 200%; background: conic-gradient(from 90deg, transparent, rgba(0, 255, 136, 0.03), transparent, rgba(0, 245, 255, 0.03), transparent); animation: xsv-rotate 15s linear infinite; z-index: 0; }\n    @keyframes xsv-rotate { 100% { transform: rotate(360deg); } }\n    #xsv-wrapper .xsv-content { position: relative; z-index: 1; }\n    #xsv-wrapper .xsv-header { text-align: center; margin-bottom: 24px; }\n    #xsv-wrapper .xsv-title { font-size: 28px; font-weight: 800; background: linear-gradient(90deg, #00ff88, #00f5ff); -webkit-background-clip: text; -webkit-text-fill-color: transparent; margin-bottom: 8px; }\n    #xsv-wrapper .xsv-subtitle { color: #888; font-size: 14px; }\n    #xsv-wrapper .xsv-panel { background: #0a0a12; border: 1px solid #222; border-radius: 12px; padding: 20px; margin-bottom: 24px; }\n    #xsv-wrapper .xsv-panel-title { font-size: 16px; color: #00ff88; margin-bottom: 16px; font-weight: 700; display: flex; align-items: center; gap: 8px; }\n    #xsv-wrapper .xsv-input-row { display: flex; gap: 10px; margin-bottom: 16px; }\n    @media (max-width: 600px) { #xsv-wrapper .xsv-input-row { flex-direction: column; } }\n    #xsv-wrapper .xsv-input { flex: 1; background: #12121a; border: 1px solid #333; border-radius: 8px; padding: 12px 16px; color: #fff; font-size: 14px; outline: none; transition: border-color 0.3s; }\n    #xsv-wrapper .xsv-input:focus { border-color: #00ff88; }\n    #xsv-wrapper .xsv-textarea { width: 100%; background: #12121a; border: 1px solid #333; border-radius: 8px; padding: 12px 16px; color: #fff; font-size: 13px; font-family: monospace; outline: none; min-height: 120px; resize: vertical; transition: border-color 0.3s; margin-bottom: 16px; }\n    #xsv-wrapper .xsv-textarea:focus { border-color: #00ff88; }\n    #xsv-wrapper .xsv-btn { padding: 12px 24px; border-radius: 8px; border: 1px solid #333; background: #12121a; color: #ccc; font-size: 14px; font-weight: 600; cursor: pointer; transition: all 0.2s; display: flex; align-items: center; gap: 6px; white-space: nowrap; }\n    #xsv-wrapper .xsv-btn:hover { background: #1a1a2e; border-color: #00ff88; color: #00ff88; transform: translateY(-2px); }\n    #xsv-wrapper .xsv-btn-primary { background: linear-gradient(135deg, #00ff8822, #00f5ff22); border-color: #00ff8855; color: #00ff88; }\n    #xsv-wrapper .xsv-progress { width: 100%; height: 6px; background: #222; border-radius: 3px; overflow: hidden; margin-bottom: 20px; display: none; }\n    #xsv-wrapper .xsv-progress.show { display: block; }\n    #xsv-wrapper .xsv-progress-bar { height: 100%; background: linear-gradient(90deg, #00ff88, #00f5ff); width: 0%; transition: width 0.3s; animation: xsv-pulse 1.5s infinite; }\n    @keyframes xsv-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.7; } }<\/p>\n<p>    #xsv-wrapper .xsv-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 12px; margin-bottom: 24px; }\n    #xsv-wrapper .xsv-stat-card { background: #12121a; border: 1px solid #2a2a35; border-radius: 10px; padding: 16px; text-align: center; }\n    #xsv-wrapper .xsv-stat-val { font-size: 24px; font-weight: 800; color: #00ff88; margin-bottom: 4px; }\n    #xsv-wrapper .xsv-stat-val.warn { color: #ffaa00; }\n    #xsv-wrapper .xsv-stat-val.bad { color: #ff4444; }\n    #xsv-wrapper .xsv-stat-label { font-size: 12px; color: #888; text-transform: uppercase; letter-spacing: 0.5px; }<\/p>\n<p>    #xsv-wrapper .xsv-table-wrap { background: #0a0a12; border: 1px solid #222; border-radius: 12px; overflow: hidden; }\n    #xsv-wrapper .xsv-table-header { display: flex; justify-content: space-between; align-items: center; padding: 16px; border-bottom: 1px solid #222; flex-wrap: wrap; gap: 10px; }\n    #xsv-wrapper .xsv-search { background: #12121a; border: 1px solid #333; border-radius: 6px; padding: 8px 12px; color: #fff; font-size: 13px; outline: none; width: 200px; }\n    #xsv-wrapper .xsv-search:focus { border-color: #00f5ff; }\n    #xsv-wrapper .xsv-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n    #xsv-wrapper .xsv-table th { background: #12121a; padding: 12px 16px; text-align: left; color: #888; font-weight: 600; text-transform: uppercase; font-size: 11px; letter-spacing: 0.5px; border-bottom: 1px solid #222; }\n    #xsv-wrapper .xsv-table td { padding: 12px 16px; border-bottom: 1px solid #1a1a24; color: #ccc; word-break: break-all; }\n    #xsv-wrapper .xsv-table tr:hover td { background: #12121a; }\n    #xsv-wrapper .xsv-status { padding: 4px 8px; border-radius: 4px; font-size: 11px; font-weight: 700; }\n    #xsv-wrapper .xsv-status.ok { background: #00ff8822; color: #00ff88; }\n    #xsv-wrapper .xsv-status.err { background: #ff444422; color: #ff4444; }<\/p>\n<p>    #xsv-wrapper .xsv-pagination { display: flex; justify-content: center; align-items: center; gap: 12px; padding: 16px; border-top: 1px solid #222; }\n    #xsv-wrapper .xsv-page-btn { padding: 6px 12px; background: #12121a; border: 1px solid #333; border-radius: 6px; color: #aaa; font-size: 13px; cursor: pointer; transition: all 0.2s; }\n    #xsv-wrapper .xsv-page-btn:hover:not(:disabled) { border-color: #00ff88; color: #00ff88; }\n    #xsv-wrapper .xsv-page-btn:disabled { opacity: 0.5; cursor: not-allowed; }\n    #xsv-wrapper .xsv-page-info { font-size: 13px; color: #888; }<\/p>\n<p>    #xsv-wrapper .xsv-actions { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 20px; justify-content: center; }\n    #xsv-wrapper .xsv-toast { position: fixed; bottom: 30px; left: 50%; transform: translateX(-50%) translateY(100px); background: #00ff88; color: #000; padding: 12px 24px; border-radius: 8px; font-weight: 700; font-size: 14px; z-index: 9999; transition: transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275); pointer-events: none; }\n    #xsv-wrapper .xsv-toast.show { transform: translateX(-50%) translateY(0); }\n  <\/style>\n<div class=\"xsv-content\">\n<div class=\"xsv-header\">\n<h2 class=\"xsv-title\">&#x1F5FA; XML Sitemap Validator<\/h2>\n<p class=\"xsv-subtitle\">Fetch, parse, and validate your XML sitemap structure instantly<\/p>\n<\/p><\/div>\n<div class=\"xsv-panel\">\n<div class=\"xsv-panel-title\">&#x1F310; Fetch or Paste Sitemap<\/div>\n<div class=\"xsv-input-row\">\n        <input type=\"text\" class=\"xsv-input\" id=\"xsv-url\" placeholder=\"Enter Sitemap URL (e.g., https:\/\/example.com\/sitemap.xml)\"><br \/>\n        <button class=\"xsv-btn xsv-btn-primary\" id=\"xsv-fetch\">&#x2B07; Fetch URL<\/button>\n      <\/div>\n<p>      <textarea class=\"xsv-textarea\" id=\"xsv-xml\" placeholder=\"OR Paste your XML sitemap content here...\"><\/textarea><br \/>\n      <button class=\"xsv-btn\" id=\"xsv-parse\" style=\"width:100%; justify-content:center;\">&#x2699; Parse &#038; Validate XML<\/button><\/p>\n<div class=\"xsv-progress\" id=\"xsv-progress\">\n<div class=\"xsv-progress-bar\" id=\"xsv-progress-bar\"><\/div>\n<\/div><\/div>\n<div id=\"xsv-results\" style=\"display:none;\">\n<div class=\"xsv-stats\" id=\"xsv-stats\"><\/div>\n<div class=\"xsv-table-wrap\">\n<div class=\"xsv-table-header\">\n          <span style=\"font-weight:700; color:#00ff88;\">Parsed URLs<\/span><br \/>\n          <input type=\"text\" class=\"xsv-search\" id=\"xsv-search\" placeholder=\"Search URLs...\">\n        <\/div>\n<div style=\"overflow-x:auto;\">\n<table class=\"xsv-table\">\n<thead>\n<tr>\n<th>#<\/th>\n<th>Location (URL)<\/th>\n<th>Last Mod<\/th>\n<th>Priority<\/th>\n<th>Status<\/th>\n<\/tr>\n<\/thead>\n<tbody id=\"xsv-tbody\"><\/tbody>\n<\/table><\/div>\n<div class=\"xsv-pagination\">\n          <button class=\"xsv-page-btn\" id=\"xsv-prev\">&#x2190; Prev<\/button><br \/>\n          <span class=\"xsv-page-info\" id=\"xsv-page-info\">Page 1<\/span><br \/>\n          <button class=\"xsv-page-btn\" id=\"xsv-next\">Next &#x2192;<\/button>\n        <\/div>\n<\/p><\/div>\n<div class=\"xsv-actions\">\n        <button class=\"xsv-btn\" id=\"xsv-copy-all\">&#x1F4CB; Copy All URLs<\/button><br \/>\n        <button class=\"xsv-btn\" id=\"xsv-export-csv\">&#x1F4BE; Export CSV<\/button><br \/>\n        <button class=\"xsv-btn\" id=\"xsv-export-txt\">&#x1F4C4; Export TXT<\/button>\n      <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"xsv-toast\" id=\"xsv-toast\">Copied!<\/div>\n<p>  <script>\n    (function() {\n      const urlInput = document.getElementById('xsv-url');\n      const xmlInput = document.getElementById('xsv-xml');\n      const progress = document.getElementById('xsv-progress');\n      const progressBar = document.getElementById('xsv-progress-bar');\n      const results = document.getElementById('xsv-results');\n      const statsContainer = document.getElementById('xsv-stats');\n      const tbody = document.getElementById('xsv-tbody');\n      const searchInput = document.getElementById('xsv-search');\n      const pageInfo = document.getElementById('xsv-page-info');\n      const toast = document.getElementById('xsv-toast');<\/p>\n<p>      let allUrls = [];\n      let filteredUrls = [];\n      let currentPage = 1;\n      const perPage = 50;<\/p>\n<p>      function showProgress(show, percent = 0) {\n        progress.classList.toggle('show', show);\n        progressBar.style.width = percent + '%';\n      }<\/p>\n<p>      function showToast(msg) { toast.textContent = msg; toast.classList.add('show'); setTimeout(() => toast.classList.remove('show'), 2000); }\n      function copyText(text) { navigator.clipboard.writeText(text).then(() => showToast('Copied! u{2705}')).catch(() => { const ta = document.createElement('textarea'); ta.value = text; document.body.appendChild(ta); ta.select(); document.execCommand('copy'); document.body.removeChild(ta); showToast('Copied! u{2705}'); }); }<\/p>\n<p>      async function fetchSitemap() {\n        const url = urlInput.value.trim();\n        if (!url) { showToast('Please enter a valid URL! u{26A0}'); return; }\n        showProgress(true, 30);\n        try {\n          const proxyUrl = 'https:\/\/corsproxy.io\/?' + encodeURIComponent(url);\n          const res = await fetch(proxyUrl);\n          if (!res.ok) throw new Error('Fetch failed');\n          showProgress(true, 70);\n          const text = await res.text();\n          xmlInput.value = text;\n          showProgress(true, 100);\n          setTimeout(() => { showProgress(false); parseAndValidate(text); }, 500);\n        } catch (e) {\n          showProgress(false);\n          showToast('Fetch failed (CORS). Please paste XML manually. u{26A0}');\n        }\n      }<\/p>\n<p>      function parseAndValidate(xmlText) {\n        if (!xmlText.trim()) { showToast('No XML content to parse! u{26A0}'); return; }\n        const parser = new DOMParser();\n        const doc = parser.parseFromString(xmlText, 'text\/xml');<\/p>\n<p>        if (doc.querySelector('parsererror')) {\n          showToast('Invalid XML structure! u{274C}');\n          return;\n        }<\/p>\n<p>        const urlNodes = doc.querySelectorAll('url');\n        allUrls = [];\n        let validCount = 0, invalidCount = 0, missingLastmod = 0;<\/p>\n<p>        urlNodes.forEach(node => {\n          const loc = node.querySelector('loc')?.textContent.trim() || '';\n          const lastmod = node.querySelector('lastmod')?.textContent.trim() || '';\n          const priority = node.querySelector('priority')?.textContent.trim() || '-';<\/p>\n<p>          let isValid = true;\n          let errorMsg = '';\n          try { new URL(loc); } catch { isValid = false; errorMsg = 'Invalid URL'; }\n          if (lastmod && isNaN(Date.parse(lastmod))) { isValid = false; errorMsg = 'Invalid Date'; }\n          if (!lastmod) missingLastmod++;<\/p>\n<p>          if (isValid) validCount++; else invalidCount++;\n          allUrls.push({ loc, lastmod: lastmod || '-', priority, isValid, errorMsg });\n        });<\/p>\n<p>        filteredUrls = [...allUrls];\n        currentPage = 1;\n        renderStats(validCount, invalidCount, missingLastmod, allUrls.length);\n        renderTable();\n        results.style.display = 'block';\n        showToast('Validation Complete! u{2705}');\n      }<\/p>\n<p>      function renderStats(valid, invalid, missing, total) {\n        statsContainer.innerHTML = `<\/p>\n<div class=\"xsv-stat-card\">\n<div class=\"xsv-stat-val\">${total}<\/div>\n<div class=\"xsv-stat-label\">Total URLs<\/div>\n<\/div>\n<div class=\"xsv-stat-card\">\n<div class=\"xsv-stat-val\">${valid}<\/div>\n<div class=\"xsv-stat-label\">Valid URLs<\/div>\n<\/div>\n<div class=\"xsv-stat-card\">\n<div class=\"xsv-stat-val ${invalid > 0 ? 'bad' : ''}\">${invalid}<\/div>\n<div class=\"xsv-stat-label\">Invalid URLs<\/div>\n<\/div>\n<div class=\"xsv-stat-card\">\n<div class=\"xsv-stat-val ${missing > 0 ? 'warn' : ''}\">${missing}<\/div>\n<div class=\"xsv-stat-label\">Missing Lastmod<\/div>\n<\/div>\n<p>        `;\n      }<\/p>\n<p>      function renderTable() {\n        tbody.innerHTML = '';\n        const start = (currentPage - 1) * perPage;\n        const end = start + perPage;\n        const pageUrls = filteredUrls.slice(start, end);<\/p>\n<p>        if (pageUrls.length === 0) {\n          tbody.innerHTML = '<\/p>\n<tr>\n<td colspan=\"5\" style=\"text-align:center; padding:20px; color:#888;\">No URLs found<\/td>\n<\/tr>\n<p>';\n        } else {\n          pageUrls.forEach((u, i) => {\n            const tr = document.createElement('tr');\n            tr.innerHTML = `<\/p>\n<td>${start + i + 1}<\/td>\n<td>${u.loc}<\/td>\n<td>${u.lastmod}<\/td>\n<td>${u.priority}<\/td>\n<td><span class=\"xsv-status ${u.isValid ? 'ok' : 'err'}\">${u.isValid ? 'Valid' : u.errorMsg}<\/span><\/td>\n<p>            `;\n            tbody.appendChild(tr);\n          });\n        }<\/p>\n<p>        const totalPages = Math.ceil(filteredUrls.length \/ perPage) || 1;\n        pageInfo.textContent = `Page ${currentPage} of ${totalPages}`;\n        document.getElementById('xsv-prev').disabled = currentPage === 1;\n        document.getElementById('xsv-next').disabled = currentPage === totalPages;\n      }<\/p>\n<p>      document.getElementById('xsv-fetch').addEventListener('click', fetchSitemap);\n      document.getElementById('xsv-parse').addEventListener('click', () => parseAndValidate(xmlInput.value));<\/p>\n<p>      searchInput.addEventListener('input', () => {\n        const q = searchInput.value.toLowerCase();\n        filteredUrls = allUrls.filter(u => u.loc.toLowerCase().includes(q));\n        currentPage = 1;\n        renderTable();\n      });<\/p>\n<p>      document.getElementById('xsv-prev').addEventListener('click', () => { if(currentPage > 1) { currentPage--; renderTable(); } });\n      document.getElementById('xsv-next').addEventListener('click', () => { const totalPages = Math.ceil(filteredUrls.length \/ perPage); if(currentPage < totalPages) { currentPage++; renderTable(); } });\n\n      document.getElementById('xsv-copy-all').addEventListener('click', () => copyText(filteredUrls.map(u => u.loc).join('n')));\n      document.getElementById('xsv-export-csv').addEventListener('click', () => {\n        let csv = 'Location,Lastmod,Priority,Statusn';\n        filteredUrls.forEach(u => csv += `\"${u.loc}\",\"${u.lastmod}\",\"${u.priority}\",\"${u.isValid ? 'Valid' : u.errorMsg}\"n`);\n        const blob = new Blob([csv], { type: 'text\/csv' }); const a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = 'sitemap-urls.csv'; a.click();\n      });\n      document.getElementById('xsv-export-txt').addEventListener('click', () => {\n        const blob = new Blob([filteredUrls.map(u => u.loc).join('n')], { type: 'text\/plain' }); const a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = 'sitemap-urls.txt'; a.click();\n      });\n    })();\n  <\/script>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Fetch, parse, and validate your XML sitemap structure instantly with detailed stats.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-51","page","type-page","status-publish"],"_links":{"self":[{"href":"https:\/\/toolskit.site\/index.php\/wp-json\/wp\/v2\/pages\/51","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/toolskit.site\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/toolskit.site\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/toolskit.site\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/toolskit.site\/index.php\/wp-json\/wp\/v2\/comments?post=51"}],"version-history":[{"count":0,"href":"https:\/\/toolskit.site\/index.php\/wp-json\/wp\/v2\/pages\/51\/revisions"}],"wp:attachment":[{"href":"https:\/\/toolskit.site\/index.php\/wp-json\/wp\/v2\/media?parent=51"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}