我有一些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”。
任何人都可以提供正确的表达吗?
答案 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") );
}