{"id":63924,"date":"2024-06-14T03:01:40","date_gmt":"2024-06-13T17:01:40","guid":{"rendered":"http:\/\/www.rjmprogramming.com.au\/ITblog\/?p=63924"},"modified":"2024-06-14T22:41:28","modified_gmt":"2024-06-14T12:41:28","slug":"xml-lint-validation-browsing-tutorial","status":"publish","type":"post","link":"https:\/\/www.rjmprogramming.com.au\/ITblog\/xml-lint-validation-browsing-tutorial\/","title":{"rendered":"XML Lint Validation Browsing Tutorial"},"content":{"rendered":"<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"XML Lint Validation Browsing Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation_browse.jpg\" title=\"XML Lint Validation Browsing Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">XML Lint Validation Browsing Tutorial<\/p><\/div>\n<p>Yesterday&#8217;s <a title='XML Lint Validation Tutorial' href='#xmllvt'>XML Lint Validation Tutorial<\/a> had us starting out on a discovery tour of XML Lint, yesterday &#8230;<\/p>\n<ul>\n<li>starting with an HTML or XML URL of interest incoming data way &#8230; and today, we add onto that &#8230;<\/li>\n<li>a local HTML or XMLfile browsing means of defining your input data into &#8230;<\/li>\n<\/ul>\n<p> &#8230; <a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php-GETME\">our changed<\/a> <a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php-GETME\">&#8220;second draft&#8221;<\/a> <a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php_GETME\">xmllint_validation.php<\/a> <a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php\">you might want to try for yourself<\/a>, helped out by <a target=_blank href='https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html----------------------------------------GETME'>a tweaked<\/a> <a target=_blank href='https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html----------------------------------------GETME'>client_browsing.htm<\/a> client side HTML and Javascript inhouse helper.<\/p>\n<p>Again, we see, into another way to yesterday&#8217;s work, how useful in a textarea element, in that it can facilitate the way &#8230;<\/p>\n<ul>\n<li>HTML and XML data can be input via populating the textarea innerHTML attribute &#8230; which flows through to a &#8230;<\/li>\n<li>textarea value attribute value where any &lt; is mapped to &amp;lt; and &gt; is mapped to &amp;gt; &#8230; ready for &#8230;<\/li>\n<li>an HTML form hosted textarea, given a filled in <i>name<\/i> attribute be able to share this data to that form&#8217;s <i>action<\/i> attributed value &#8230;<br \/>\n&lt;?php<br \/>\n<code><br \/>\nfunction ronecheck() {<br \/>\n   if (document.getElementById('result1').innerHTML != '') {<br \/>\n      document.getElementById('incoming').innerHTML=document.getElementById('result1').value;<br \/>\n      document.getElementById('result1').innerHTML='';<br \/>\n      document.getElementById('result1').value='';<br \/>\n      document.getElementById('myhxfile').name='xx';<br \/>\n      document.getElementById('mysub').click();<br \/>\n   }<br \/>\n}<br \/>\n<\/code><br \/>\n?&gt;<br \/>\n &#8230; (in our case being the same PHP) &#8230;<\/li>\n<li>able to be processed by recall PHP interventional code &#8230;<br \/>\n&lt;?php<br \/>\n<code><br \/>\n $vsnone='none';<br \/>\n $prefn='Please enter either HTML or XML file to validate ...';<br \/>\n $pth='';<br \/>\n $rn='' .rand(1,78477554);<br \/>\n $results='';<br \/>\n $precontents='';<br \/>\n $contents='';<br \/>\n $fn='';<br \/>\n if (!isset($_GET['htmlfile']) && isset($_GET['content'])) {<br \/>\n   $_GET['htmlfile']=$_GET['content'];<br \/>\n }<br \/>\n if (!isset($_POST['htmlfile']) && isset($_POST['content'])) {<br \/>\n   $_POST['htmlfile']=$_POST['content'];<br \/>\n }<br \/>\n if (isset($_GET['htmlfile'])) {<br \/>\n   if (substr(trim(urldecode($_GET['htmlfile'])) . ' ', 0, 1) == '&lt;') {<br \/>\n   $contents=trim(str_replace('+',' ',urldecode($_GET['htmlfile'])));<br \/>\n   if (strpos(strtolower(explode('&gt;', $contents)[0]), 'html') !== false) {<br \/>\n   $fn='\/tmp\/html_' . $rn . '.html';<br \/>\n   } else if (strpos(strtolower(explode('&gt;', $contents)[0]), 'xml') !== false) {<br \/>\n   $fn='\/tmp\/xml_' . $rn . '.xml';<br \/>\n   }<br \/>\n   file_put_contents($fn, $contents);<br \/>\n   } else {<br \/>\n   $fn=str_replace('+',' ',urldecode($_GET['htmlfile']));<br \/>\n   }<br \/>\n   if ($fn != '') {<br \/>\n   if (strpos($fn, 'localhost') !== false) {<br \/>\n     $rhs=explode('localhost' . explode('\/', explode('localhost', $fn)[1])[0], $fn)[1];<br \/>\n     $fn=$_SERVER['DOCUMENT_ROOT'] . $rhs;<br \/>\n     $pth='\/usr\/bin\/';<br \/>\n   } else if (strpos($fn, 'rjmprogramming.com.au') !== false) {<br \/>\n     $rhs=explode('rjmprogramming.com.au' . explode('\/', explode('rjmprogramming.com.au', $fn)[1])[0], $fn)[1];<br \/>\n     $fn=$_SERVER['DOCUMENT_ROOT'] . $rhs;<br \/>\n   } else if (strpos($_SERVER['SERVER_NAME'], 'localhost') !== false) {<br \/>\n     $pth='\/usr\/bin\/';<br \/>\n   }<br \/>\n   }<br \/>\n   if (file_exists($fn)) {<br \/>\n   if ($contents == '') {<br \/>\n     $contents=file_get_contents($fn);<br \/>\n   }<br \/>\n   $prefn=$fn;<br \/>\n   $fn=realpath($fn);<br \/>\n if (strpos(strtolower($fn), '.xml') !== false) {<br \/>\n   $vsnone='block';<br \/>\n   $results=shell_exec($pth . 'xmllint --valid --noout ' . $fn . ' 2&gt; ' . ' ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n   if (file_exists(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err')) {<br \/>\n     $results.=\"\\n\";<br \/>\n     $results.=file_get_contents(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n     unlink(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n   }<br \/>\n } else if (strpos(strtolower($fn), '.htm') !== false) {<br \/>\n   $vsnone='block';<br \/>\n   $results=shell_exec($pth . 'xmllint --html --valid --noout ' . $fn . ' 2&gt; ' . ' ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n   if (file_exists(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err')) {<br \/>\n     $results.=\"\\n\";<br \/>\n     $results.=file_get_contents(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n     unlink(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n   }<br \/>\n }<br \/>\n   if (strpos($fn, '\/tmp\/') !== false) { unlink($fn);  }<br \/>\n   } else {<br \/>\n   $contents='';<br \/>\n   if (strpos($fn, '\/tmp\/') !== false) { unlink($fn);  }<br \/>\n   }<br \/>\n } else if (isset($_POST['htmlfile'])) {<br \/>\n   if (substr(trim(urldecode($_POST['htmlfile'])) . ' ', 0, 1) == '&lt;') {<br \/>\n   $contents=trim(str_replace('+',' ',urldecode($_POST['htmlfile'])));<br \/>\n   if (strpos(strtolower(explode('&gt;', $contents)[0]), 'html') !== false) {<br \/>\n   $fn='\/tmp\/html_' . $rn . '.html';<br \/>\n   } else if (strpos(strtolower(explode('&gt;', $contents)[0]), 'xml') !== false) {<br \/>\n   $fn='\/tmp\/xml_' . $rn . '.xml';<br \/>\n   }<br \/>\n   file_put_contents($fn, $contents);<br \/>\n   } else {<br \/>\n   $fn=str_replace('+',' ',urldecode($_POST['htmlfile']));<br \/>\n   }<br \/>\n   if ($fn != '') {<br \/>\n   if (strpos($fn, 'localhost') !== false) {<br \/>\n     $rhs=explode('localhost' . explode('\/', explode('localhost', $fn)[1])[0], $fn)[1];<br \/>\n     $fn=$_SERVER['DOCUMENT_ROOT'] . $rhs;<br \/>\n     $pth='\/usr\/bin\/';<br \/>\n   } else if (strpos($fn, 'rjmprogramming.com.au') !== false) {<br \/>\n     $rhs=explode('rjmprogramming.com.au' . explode('\/', explode('rjmprogramming.com.au', $fn)[1])[0], $fn)[1];<br \/>\n     $fn=$_SERVER['DOCUMENT_ROOT'] . $rhs;<br \/>\n   } else if (strpos($_SERVER['SERVER_NAME'], 'localhost') !== false) {<br \/>\n     $pth='\/usr\/bin\/';<br \/>\n   }<br \/>\n   }<br \/>\n   if (file_exists($fn)) {<br \/>\n   $prefn=$fn;<br \/>\n   if ($contents == '') {<br \/>\n     $contents=file_get_contents($fn);<br \/>\n   }<br \/>\n   $fn=realpath($fn);<br \/>\n if (strpos(strtolower($fn), '.xml') !== false) {<br \/>\n   $vsnone='block';<br \/>\n   $results=shell_exec($pth . 'xmllint --valid --noout ' . $fn . ' 2&gt; ' . ' ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n   if (file_exists(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err')) {<br \/>\n     $results.=\"\\n\";<br \/>\n     $results.=file_get_contents(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n     unlink(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n   }<br \/>\n } else if (strpos(strtolower($fn), '.htm') !== false) {<br \/>\n   $vsnone='block';<br \/>\n   $results=shell_exec($pth . 'xmllint --html --valid --noout ' . $fn . ' 2&gt; ' . ' ' . rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n   if (file_exists(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err')) {<br \/>\n     $results.=\"\\n\";<br \/>\n     $results.=file_get_contents(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n     \/\/file_put_contents('xxx.xxx', $results);<br \/>\n     unlink(rtrim(dirname(__FILE__), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'xmllint.err');<br \/>\n   }<br \/>\n }<br \/>\n   if (strpos($fn, '\/tmp\/') !== false) { unlink($fn);  }<br \/>\n   } else {<br \/>\n   $contents='';<br \/>\n   if (strpos($fn, '\/tmp\/') !== false) { unlink($fn);  }<br \/>\n   }<br \/>\n }<br \/>\n if ($contents != '') {<br \/>\n   $lines=explode(\"\\n\", $contents);<br \/>\n   for ($ii=1; $ii&lt;=sizeof($lines); $ii++) {<br \/>\n     $precontents.='' . $ii . \"\\n\";<br \/>\n   }<br \/>\n }<br \/>\n<\/code><br \/>\n?&gt;\n<\/ul>\n<p>Cute, huh?!<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/new-xml-lint-validation-browsing-tutorial\/'>XML Lint Validation Browsing Tutorial<\/a>.<\/p-->\n<hr>\n<p id='xmllvt'>Previous relevant <a target=_blank title='XML Lint Validation Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/xml-lint-validation-tutorial\/'>XML Lint Validation Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"XML Lint Validation Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.jpg\" title=\"XML Lint Validation Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">XML Lint Validation Tutorial<\/p><\/div>\n<p>Do you remember when we discussed the Sanitizer API, talked about at <a title='Sanitizer API Primer Tutorial' href='#sapipt'>Sanitizer API Primer Tutorial<\/a>, regarding it as a web application HTML (and more) validation tool?<\/p>\n<p>Well, we&#8217;ve based a new &#8220;validator&#8221; of HTML or XML using the <a target=_blank title='xmllint on Linux information' href='https:\/\/linux.die.net\/man\/1\/xmllint'>XML Lint<\/a> web application on what we did then, but this code needing to be &#8230;<\/p>\n<ul>\n<li>under the auspices of a serverside scenario &#8230; ie. PHP &#8230; for us &#8230; calling on &#8230;<\/li>\n<li>underlying operating system call such as (for HTML qsall.htm incoming data file) &#8230;<br \/>\n<code><br \/>\nxmllint --html --valid --noout .\/qsall.htm<br \/>\n<\/code><br \/>\n &#8230; via &#8230;<\/li>\n<li><a target=_blank title='PHP shell_exec() method information' href='http:\/\/php.net\/manual\/en\/function.shell-exec.php'>shell_exec<\/a><\/li>\n<\/ul>\n<p> &#8230; there&#8217;s not much left of the original HTML and Javascript!<\/p>\n<p>We had a fun time with HTML textarea elements and scrolling with the resultant <a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php_GETME\">&#8220;first draft&#8221;<\/a> <a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php_GETME\">xmllint_validation.php<\/a> <a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/xmllint_validation.php\">you might want to try for yourself<\/a> supplying an HTML or XML URL of intetest.  Why, in particular?  Well, it was the first time that we remember trying to make practically useful &#8230;<\/p>\n<ul>\n<li>a table cell (ie. td element) (the left of two) hosted &#8230;<\/li>\n<li>two textarea element arrangement whereby, ideally. they view &#8230;\n<ol>\n<li>side by side<\/li>\n<li>if one is scrolled the two identically scroll the same amount &#8230; <font size=1>(document.body outerHTML)<\/font> HTML &#8230;<br \/>\n&lt;?php echo &#8221;<br \/>\n<code><br \/>\n&lt;body onload=\"s1 = document.getElementById('preincoming'); s2 = document.getElementById('incoming'); s1.addEventListener('scroll', select_scroll_1, false); s2.addEventListener('scroll', select_scroll_2, false);\" data-onload='onl();'&gt;<br \/>\n&lt;h1&gt;XML Lint Validation &lt;!--button onclick='trythis();' title='Try your own'&gt;Usage&lt;\/button--&gt;&lt;\/h1&gt;<br \/>\n&lt;h3&gt;RJM Programming - June, 2024&lt;\/h3&gt;<br \/>\n&lt;form action=.\/xmllint_validation.php method=POST target=_self&gt;<br \/>\n&lt;table style=width:95%; border=5&gt;<br \/>\n&lt;tr&gt;&lt;th colspan=2 style=text-align:center;&gt;XML Lint validation of &lt;input style=width:70%; onblur=\"if (this.value.length &gt; 0) { document.getElementById('mysub').click();  }\" name=htmlfile id=myhxfile placeholder='Please enter either HTML or XML file to validate ...' value=\"&lt;?php echo str_replace('&gt;','&gt;',str_replace('&lt;','&lt;',$prefn)); ?&gt;\"&gt;&lt;\/input&gt;&lt;\/th&gt;&lt;\/tr&gt;<br \/>\n&lt;tr&gt;&lt;th&gt;Data to validate&lt;\/th&gt;&lt;th&gt;XML Lint results&lt;\/th&gt;&lt;\/tr&gt;<br \/>\n&lt;tr&gt;&lt;td style=vertical-align:top;&gt;&lt;textarea style=font-size:8px;display:inline-block;overflow-x:clip;text-wrap:nowrap;text-align:right; id=preincoming&gt;&lt;?php echo str_replace('&gt;','&gt;',str_replace('&lt;','&lt;',$precontents)); ?&gt;&lt;\/textarea&gt;&lt;textarea onblur=\"if (this.value.length &gt; 0 && '&lt;?echo $fn; ?&gt;' == '') { document.getElementById('mysub').click();  }\" style=font-size:8px;display:inline-block;overflow-x:clip;text-wrap:nowrap; name=content id=incoming&gt;&lt;?php echo str_replace('&gt;','&gt;',str_replace('&lt;','&lt;',$contents)); ?&gt;&lt;\/textarea&gt;&lt;\/td&gt;&lt;td style=vertical-align:top;&gt;&lt;textarea id=outgoing&gt;&lt;?php echo str_replace('&gt;','&gt;',str_replace('&lt;','&lt;',$results)); ?&gt;&lt;\/textarea&gt;&lt;\/td&gt;&lt;\/tr&gt;<br \/>\n&lt;tr&gt;&lt;td&gt;&lt;\/td&gt;&lt;td&gt;&lt;input type=submit id=mysub style=display:&lt;?php echo $vsnone; ?&gt; value=Validate&gt;&lt;\/input&gt;&lt;\/td&gt;&lt;\/tr&gt;<br \/>\n&lt;\/table&gt;<br \/>\n&lt;\/form&gt;<br \/>\n&lt;\/body&gt;<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;<br \/>\n &#8230; uses Javascript &#8230;<br \/>\n&lt;?php echo &#8221;<br \/>\n<code><br \/>\nvar s1=null, s2=null;<br \/>\n<br \/>\n\/\/ Thanks to <a target=_blank href='https:\/\/stackoverflow.com\/questions\/7108270\/scrolling-2-different-elements-in-same-time' title='https:\/\/stackoverflow.com\/questions\/7108270\/scrolling-2-different-elements-in-same-time'>https:\/\/stackoverflow.com\/questions\/7108270\/scrolling-2-different-elements-in-same-time<\/a><br \/>\nfunction select_scroll_1(e) { s2.scrollTop = s1.scrollTop; }<br \/>\nfunction select_scroll_2(e) { s1.scrollTop = s2.scrollTop; }<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;<br \/>\n&#8230; so that &#8230;<\/li>\n<li>the left hand textarea contains code line numbers right aligned &#8230; to sidle up next to &#8230;<\/li>\n<li>the right hand textarea contains the code (HTML or XML) being validated by xmllint<\/li>\n<\/ol>\n<p> &#8230; while &#8230;\n<\/li>\n<li>the right hand table cell contains the xmllint validation (of HTML or XML) results<\/li>\n<\/ul>\n<p> &#8230; had us, in practice, thanking our lucky stars that &#8230;<\/p>\n<ol>\n<li>textarea elements are resizeable<\/li>\n<li>you can simulate &#8220;some cockpit action&#8221; aligning them vertically &#8230; <a target=_blank title='?' href='https:\/\/www.youtube.com\/watch?v=0TiqXFssKMY'>Jim<\/a>?!<\/li>\n<\/ol>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/xml-lint-validation-tutorial\/'>XML Lint Validation Tutorial<\/a>.<\/p-->\n<hr>\n<p id='sapipt'>Previous relevant <a target=_blank title='Sanitizer API Primer Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/sanitizer-api-primer-tutorial\/'>Sanitizer API Primer Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/sanitizer_api_test.html\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Sanitizer API Primer Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/sanitizer_api_test.jpg\" title=\"Sanitizer API Primer Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Sanitizer API Primer Tutorial<\/p><\/div>\n<p>Today we&#8217;re roadtesting the <a target=_blank title='Sanitizer API' href='https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/HTML_Sanitizer_API'>Sanitizer API<\/a> &#8230;<\/p>\n<blockquote cite='https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/HTML_Sanitizer_API'><p>\nThe HTML Sanitizer API allow developers to take untrusted strings of HTML and Document or DocumentFragment objects, and sanitize them for safe insertion into a document&#8217;s DOM.\n<\/p><\/blockquote>\n<p> &#8230; as another validation idea for HTML to add to our previous <a target=_blank title='HTML Online Validation Tidy Errors Tutorial' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/html-online-validation-tidy-errors-tutorial'>HTML Online Validation Tidy Errors Tutorial<\/a> efforts.<\/p>\n<p>Perhaps you&#8217;d like to try the &#8220;Usage&#8221; button of the <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/sanitizer_api_test.html_GETME\" title=\"sanitizer_api_test.html\">proof of concept <a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/sanitizer_api_test.html\" title=\"Click picture\">web application<\/a> below &#8230;<\/p>\n<p><iframe style=\"width:100%;height:1000px;\" src=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/sanitizer_api_test.html\"><\/iframe><\/p>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d56492' onclick='var dv=document.getElementById(\"d56492\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/validation\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d56492' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d63915' onclick='var dv=document.getElementById(\"d63915\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/linux\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d63915' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d63924' onclick='var dv=document.getElementById(\"d63924\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/browse\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d63924' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Yesterday&#8217;s XML Lint Validation Tutorial had us starting out on a discovery tour of XML Lint, yesterday &#8230; starting with an HTML or XML URL of interest incoming data way &#8230; and today, we add onto that &#8230; a local &hellip; <a href=\"https:\/\/www.rjmprogramming.com.au\/ITblog\/xml-lint-validation-browsing-tutorial\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,14,29,37],"tags":[3672,1993,3531,251,252,2288,513,4792,4790,4791,555,611,626,631,2032,4787,1907,2287,835,1772,2960,4789,4788,1319,1429],"class_list":["post-63924","post","type-post","status-publish","format-standard","hentry","category-elearning","category-event-driven-programming","category-operating-system","category-tutorials","tag-broadband","tag-browse","tag-browsing","tag-connect","tag-connection","tag-fibre-to-the-node","tag-google","tag-google-home","tag-google-mesh","tag-google-wifi-mesh","tag-hardware-2","tag-install","tag-ios","tag-iphone","tag-lan","tag-mesh","tag-modem","tag-nbn","tag-network","tag-port","tag-setup","tag-subnet","tag-subnetwork","tag-tutorial","tag-wifi"],"_links":{"self":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/63924"}],"collection":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/comments?post=63924"}],"version-history":[{"count":6,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/63924\/revisions"}],"predecessor-version":[{"id":63937,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/63924\/revisions\/63937"}],"wp:attachment":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/media?parent=63924"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/categories?post=63924"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/tags?post=63924"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}