2010-09-20 91 views
0

我有一些XML我想通過JavaScript正則表達式提取。 XML的示例如下所示:正則表達式提取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」。

任何人都可以提供正確的表達嗎?

+0

你不應該使用正則表達式,但'<([^>] +)'可能會做:) – jensgram 2010-09-20 11:44:01

回答

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

+0

+1鏈接到答案:) – Dror 2010-09-20 11:52:42

+0

+1是的,這是一個偉大的鏈接 – 2010-09-20 12:45:04

+0

@Downvoter:照顧解釋?你可以試着改善答案。 – Boldewyn 2010-09-20 14:30:05

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

不要使用正則表達式來做這種事情。而使用DOM處理功能,例如

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

或循環通過gtElements並使用gtElements.getElementsByTagName('startsWith') – Alex 2010-09-20 11:43:28

+0

準確。我錯過了嵌套的事實。 – teukkam 2010-09-20 14:06:35

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