用于提取XML标记的正则表达式

时间:2010-09-20 11:35:34

标签: javascript regex

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

<rules><and><gt propName="Unit" value="5" type="System.Int32"/><or><startsWith propName="DeviceType"/></or></and></rules>

我在提取xml名称“gt”和“startsWith”时遇到问题。例如,使用以下表达式

<(.+?)\s

我明白了:

“<rules><and><gt”

而不仅仅是“gt”。

任何人都可以提供正确的表达吗?

4 个答案:

答案 0 :(得分:4)

正则表达式是一个解析xml的糟糕工具。您可以轻松地在JavaScript中解析XML。像jQuery这样的库使得这项任务变得特别简单(例如):

var xml = '<rules><and><gt propName="Unit" value="5" type="System.Int32"/><or><startsWith propName="DeviceType"/></or></and></rules>';
var gt = $('gt', xml);
var t = gt.attr('type'); //System.Int32

答案 1 :(得分:2)

好吧,\s匹配空格。所以你实际上告诉正则表达式引擎:

<(.+?)\s
^^    ^
||    \ until you find a whitespace
|\ slurp in anything (but whitespace)
\ as long as it starts with an opening pointy bracket

你可以,例如使用:

<([^\s>]+?)

但您应该始终考虑this

答案 2 :(得分:1)

不要使用正则表达式来做这种事情。而是使用DOM处理函数,例如

var gtElements = document.getElementsByTagName('gt');
var startsWithElements = document.getElementsByTagName('startsWith'); 

答案 3 :(得分:1)

最强大的方法是使用浏览器的内置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") );
}