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

时间:2014-09-17 19:24:35

标签: javascript jquery html xml regex

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

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

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

2 个答案:

答案 0 :(得分:2)

您可以使用以下函数处理无效的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

答案 1 :(得分:1)

我建议一个小的正则表达式黑客攻击:

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));

请注意,它不支持属性,但可以轻松扩展以支持它们。

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