2015-10-05 86 views
2

我把这行作为uml文档的一部分。如何从JavaScript中的一行XML中获取属性?

<children xmi:type="corstr:heighj" uml:name="private" x="255" y="188" width="221" height="51"/> 
  • 我需要为X,Y的宽度和高度*

我用这个函数试图值

function getValues(mainBlock, valueLine) { 


console.log("searching for data in " + valueLine) 

console.log("x? " + getValueFromLine(valueLine, "x=\"")); 
console.log("y? " + getValueFromLine(valueLine, "y=\"")); 
console.log("width? " + getValueFromLine(valueLine, "width=\"")); 



function getValueFromLine(valueLine, searchFor) 
{ 
    var position = valueLine.indexOf(searchFor); 

    return valueLine.substr(position + searchFor.length, (valueLine.indexOf("\"", position + searchFor.length)) - position + searchFor.length); 
} 

但显然东西是错误的,所以我得到这个在控制台

x? 255" y="1<br> 
index1.html:179 y? 188" width<br> 
index1.html:180 width? 221" height="51"/ 

回答

0

我不确定是否有解决方案,但我写了一个功能,可以帮助你。

我已经采取了拆分字符串和分别解析属性的方法,并允许您根据需要使用元素 - 我已经写了一个函数作为给定字符串的闭包。

它分裂的空间,然后我解析的故障和分裂的EQUALS,然后解析整数如果可能的话,最终创建包含解析值的对象。 A 帮助函数让你指定函数中的值。

看看fiddle,让我知道如果你不明白的代码。

function parse_uml(valueLine) { 
    var value_map = {}; 
    var breakdown = valueLine.split(" "); 
    breakdown.shift(); 
    breakdown[breakdown.length - 1] = breakdown[breakdown.length - 1].substr(0, breakdown[breakdown.length - 1].length - 2); 
    breakdown.map(function (i) { 
     var attr = i.split("="); 
     if (parseInt(attr[1].substr(1, attr[1].length - 2))) { 
      value_map[attr[0]] = parseInt(attr[1].substr(1, attr[1].length - 2)); 
     } else { 
      value_map[attr[0]] = attr[1].substr(1, attr[1].length - 2); 
     } 
    }); 
    return function (searchFor) { 
     return value_map[searchFor]; 
    }; 
} 

用法 -

var parsed_uml = parse_uml('<children xmi:type="corstr:heighj" uml:name="private" x="255" y="188" width="221" height="51"/>', 'width'); 

console.log("Value of x - " + parsed_uml("x")); 
console.log("Value of y - " + parsed_uml("y")); 
console.log("Value of width - " + parsed_uml("width")); 

http://jsfiddle.net/u6yxb4es/

0

嗨,我写了,我叉你的XML解析器。这段代码将一个dom元素转换为一个对象。下面的代码可以帮助您提取给定XML标记中的属性。

http://jsfiddle.net/wyqm16k0/

function parsethis(line){ 
    var x = line.split(" "), dom = x.shift(), obj; 
    dom = dom.replace("<",""); 
    x[x.length-1] = x[x.length-1].replace("/>",""); 
    x.forEach(function(element, index, array){ 
    var str = '"'+array[index]; 
    str = str.replace('=','":'); 
    array[index] = str; 
    }); 

    obj = x.join(""); 
    obj = "{"+obj.replace(/""/g,'","')+"}"; 
    obj = JSON.parse(obj); 
    obj.dom = dom; 
    return obj; 
} 

var parsed = parsethis('<children xmi:type="corstr:heighj" uml:name="private" x="255" y="188" width="221" height="51"/>'); 
console.log("X = "+parsed.x,", Y = "+parsed.y, ", Width = "+parsed.width); 
0

您可以使用DOMParser API来分析你的整个文件为XML文件,然后得到像其他任何一个DOMElement你的元素,使用其getAttributeNS()方法。

因为我没有整个文档,这里是一个概念证明,非申报XSI后和UML的命名空间属性已经从字符串中删除:

function cleanNS(input) { 
 
    var str = input.split(' '); 
 
    var cleaned = []; 
 
    str.forEach(function(e) { 
 
    if (e.split('=')[0].indexOf(':') === -1) { 
 
     cleaned.push(e); 
 
    } 
 
    }); 
 
    return cleaned.join(' '); 
 
} 
 

 
var parser = new DOMParser(); 
 

 
var cleanDoc = cleanNS('<children xmi:type="corstr:heighj" uml:name="private" x="255" y="188" width="221" height="51"/>'); 
 

 
var element = parser.parseFromString(cleanDoc, 'application/xml').documentElement; 
 

 
function log(str) { 
 
    document.body.innerHTML = str; 
 
} 
 
log("x = " + element.getAttributeNS(null, 'x') + ", y = " + element.getAttributeNS(null, 'y') + ", width = " + element.getAttributeNS(null, 'width'));