我想在变量或文本框中找到未关闭的XML标记。
var xml = "<name>supun</name><age>23<year>1111</year>";
所以年龄没有结束标记,我想找到那个标签
答案 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);
答案 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));
请注意,它不支持属性,但可以轻松扩展以支持它们。
更新:已更新为支持属性。