Javascript 用于提取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”时遇到问题。例如,使

我想通过javascript正则表达式提取一些XML。XML的一个示例如下所示:

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