如何使用jQuery在变量中查找无效的未闭合XML标记

How to find invalid unclosed XML tags in a variable using jQuery?

本文关键字:标记 XML 无效 查找 jQuery 何使用 变量      更新时间:2023-09-26

我想在变量或文本框中找到未闭合的XML标记。

var xml = "<name>supun</name><age>23<year>1111</year>";

所以年龄没有结束标签,我想找到标签

您可以使用以下函数处理无效xml,如下所示

var xt="",h3OK=1
function checkErrorXML(x)
{
xt=""
h3OK=1
checkXML(x)
}
function checkXML(n)
{
var l,i,nam
nam=n.nodeName
if (nam=="h3")
	{
	if (h3OK==0)
		{
		return;
		}
	h3OK=0
	}
if (nam=="#text")
	{
	xt=xt + n.nodeValue + "'n"
	}
l=n.childNodes.length
for (i=0;i<l;i++)
	{
	checkXML(n.childNodes[i])
	}
}        
function validateXML(xml)
    {
    // code for IE
    if (window.ActiveXObject)
      {
      var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
      xmlDoc.async=false;
      xmlDoc.loadXML(xml);
    
      if(xmlDoc.parseError.errorCode!=0)
        {
        txt="Error Code: " + xmlDoc.parseError.errorCode + "'n";
        txt=txt+"Error Reason: " + xmlDoc.parseError.reason;
        txt=txt+"Error Line: " + xmlDoc.parseError.line;
        alert(txt);
        }
      else
        {
        alert("No errors found");
        }
      }
    // code for Mozilla, Firefox, Opera, etc.
    else if (document.implementation && document.implementation.createDocument)
      {
    var parser=new DOMParser();
    var text=xml;
    var xmlDoc=parser.parseFromString(text,"text/xml");
    if (xmlDoc.getElementsByTagName("parsererror").length>0)
        {
        checkErrorXML(xmlDoc.getElementsByTagName("parsererror")[0]);
        alert(xt)
        }
      else
        {
        alert("No errors found");
        }
      }
    else
      {
      alert('Your browser cannot handle this script');
      }
    }
var xml="<xml><name>supun</name><age>23<year>1111</year></xml>";
validateXML(xml);

来源:http://www.w3schools.com/dom/dom_errors.asp

我建议一个小的regexp破解:

var str = "<name>supun</name><age>23<year>1111</year>";
function getInvalidTags(str)
{
    // remove text between XML tags:
    var noText = str.replace(/>[^<>]*</g, "><");
    var prev = noText;
    var next = "";
    // while something changed remove <any></any> pairs
    while (prev != (next = prev.replace(/<([^<>]*)( [^<>]*)?><'/'1>/g, "")))
        prev = next;
    return prev;
}
console.log(getInvalidTags(str));

请注意,它不支持属性,但可以很容易地进行扩展以支持它们。

更新:已更新以支持属性。