Javascript 用于提取XML标记的正则表达式
我想通过javascript正则表达式提取一些XML。XML的一个示例如下所示:Javascript 用于提取XML标记的正则表达式,javascript,regex,Javascript,Regex,我想通过javascript正则表达式提取一些XML。XML的一个示例如下所示: <rules><and><gt propName="Unit" value="5" type="System.Int32"/><or><startsWith propName="DeviceType"/></or></and></rules> 我在提取xml名称“gt”和“startsWith”时遇到问题。例如,使
<rules><and><gt propName="Unit" value="5" type="System.Int32"/><or><startsWith propName="DeviceType"/></or></and></rules>
我在提取xml名称“gt”和“startsWith”时遇到问题。例如,使用以下表达式
<(.+?)\s
Regex是一个解析xml的糟糕工具。您可以轻松地用JavaScript解析XML。像jQuery这样的库使此任务特别容易(例如):
var xml='';
var gt=$('gt',xml);
var t=gt.attr(‘类型’)//System.Int32
不要使用正则表达式来做这种事情。而是使用DOM处理函数,例如
var gtElements = document.getElementsByTagName('gt');
var startsWithElements = document.getElementsByTagName('startsWith');
嗯,\s
匹配空格。因此,您实际上告诉正则表达式引擎:
<(.+?)\s
^^ ^
|| \ until you find a whitespace
|\ slurp in anything (but whitespace)
\ as long as it starts with an opening pointy bracket
最可靠的方法是使用浏览器内置的XML解析器和标准DOM方法来提取所需的元素:
var parseXml;
if (window.DOMParser) {
parseXml = function(xmlStr) {
return ( new window.DOMParser() ).parseFromString(xmlStr, "text/xml");
};
} else if (typeof window.ActiveXObject != "undefined" &&
new window.ActiveXObject("Microsoft.XMLDOM")) {
parseXml = function(xmlStr) {
var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = "false";
xmlDoc.loadXML(xmlStr);
return xmlDoc;
};
} else {
parseXml = function() { return null; }
}
var xmlStr = '<rules><and>' +
'<gt propName="Unit" value="5" type="System.Int32"/><or>' +
'<startsWith propName="DeviceType"/></or></and></rules>';
var xmlDoc = parseXml(xmlStr);
if (xmlDoc) {
var gt = xmlDoc.getElementsByTagName("gt")[0];
alert( gt.getAttribute("propName") );
}
var-parseXml;
if(window.DOMParser){
parseXml=函数(xmlStr){
return(new window.DOMParser()).parseFromString(xmlStr,“text/xml”);
};
}else if(typeof window.ActiveXObject!=“未定义”&&
新建window.ActiveXObject(“Microsoft.XMLDOM”)){
parseXml=函数(xmlStr){
var xmlDoc=new window.ActiveXObject(“Microsoft.XMLDOM”);
xmlDoc.async=“false”;
loadXML(xmlStr);
返回xmlDoc;
};
}否则{
parseXml=function(){return null;}
}
var xmlStr=''+
'' +
'';
var xmlDoc=parseXml(xmlStr);
if(xmlDoc){
var gt=xmlDoc.getElementsByTagName(“gt”)[0];
警报(gt.getAttribute(“propName”);
}
或循环通过gtElements并准确地使用gtElements.getElementsByTagName('StartWith')。我忽略了和是嵌套的这一事实。您不应该使用正则表达式,但是]+)
可能会这样做:)@Downvoter:想解释一下吗?你可以试着改进一下答案,我放弃了一个xml解析器的正则表达式,现在它可以正常工作了。谢谢大家。
<(.+?)\s
^^ ^
|| \ until you find a whitespace
|\ slurp in anything (but whitespace)
\ as long as it starts with an opening pointy bracket
<([^\s>]+?)
var parseXml;
if (window.DOMParser) {
parseXml = function(xmlStr) {
return ( new window.DOMParser() ).parseFromString(xmlStr, "text/xml");
};
} else if (typeof window.ActiveXObject != "undefined" &&
new window.ActiveXObject("Microsoft.XMLDOM")) {
parseXml = function(xmlStr) {
var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = "false";
xmlDoc.loadXML(xmlStr);
return xmlDoc;
};
} else {
parseXml = function() { return null; }
}
var xmlStr = '<rules><and>' +
'<gt propName="Unit" value="5" type="System.Int32"/><or>' +
'<startsWith propName="DeviceType"/></or></and></rules>';
var xmlDoc = parseXml(xmlStr);
if (xmlDoc) {
var gt = xmlDoc.getElementsByTagName("gt")[0];
alert( gt.getAttribute("propName") );
}