2012-09-18 82 views
0

我真的試圖通過比較另一個XML得到一個XML的屬性值,如下所示:通過比較兩個XML數據獲得一個xml的屬性

xmlData1變量XML like-- - >

<Root> 
    <RNA A="100" x="table1" y="car11"/> 
    <RNA A="101" x="table2" y="car12"/> 
    <RNA A="102" x="table3" y="car13"/> 
    <RNA A="103" x="table4" y="car14"/> 
    <RNA A="104" x="table5" y="car15"/> 
    <RNA A="105" x="table6" y="car16"/> 
    <RNA A="106" x="table7" y="car17"/> 
    <RNA A="107" x="table8" y="car18"/> 
    <RNA A="108" x="table9" y="car19"/> 
</Root> 

xmlData2變量具有XML等--->

<Ina> 
    <RNA B="100" x="table1" y="car11"/> 
    <RNA B="101" x="table2" y="car12"/> 
    <RNA B="102" x="table3" y="car13"/> 
</Ina> 

這裏我曾比較喜歡

if(xmlData1.getAttribute(x)==xmlData2.getAttribute(x) then 
//code goes 

如何實現這一目標???請幫助

+0

不清楚你真的想要比較 – wroniasty

+0

我很抱歉,如果我不清楚,我只需要比較'x'屬性值彼此,如果匹配,則獲得'x'屬性值。 – user1495475

回答

-1

這很合理簡單。首先,你解析XML。實際上,我已經將X瀏覽器功能放在了一起,非常適合您的需求。您可以find it here
取消註釋該行:

keep.push(parsed);//last element of array is the full DOM 

只是把它就像這樣:

var data1 = parseXML(xml1,'RNA','x');//xml1 is the first xml string 
var data2 = parseXML(xml2,'RNA','x');//xml2 === second xml string 
var xml1Parsed = data1.splice(-1);//assign document to variable 
var xml2Parsed = data2.splice(-1); 
//get the nodes of intrest 
var RNA1 = xml1Parsed.getElementsByTagName('RNA'); 
var RNA2 = xml2Parsed.getElementsByTagName('RNA'); 

兩個data1data2現在陣列,只是在它們之間迭代:

for (var i=0;i<data1.length;i++) 
{ 
    if (data1[i] === data2[i])//attribute x is the same 
    {//check whatever you need 
     if (RNA1[i].getAttribute('y') === RNA2[i].getAttribute('y')) 
     { 
      console.log('node ' + i + ' is alike');//do stuff 
     } 
    } 
} 

爲了完整和清晰,這是功能作爲本例中使用:

var parseXML = (function(w,undefined) 
{ 
    'use strict'; 
    var parser,i,ie,parsed; 
    ie = false; 
    switch (true) 
    { 
     case w.DOMParser !== undefined: 
      parser = new w.DOMParser(); 
     break; 
     case new w.ActiveXObject("Microsoft.XMLDOM") !== undefined: 
      parser = new w.ActiveXObject("Microsoft.XMLDOM"); 
      parser.async = false; 
      ie = true; 
     break; 
     default : 
      throw new Error('No parser found'); 
    } 
    return function(xmlString,getTags,getAttr) 
    { 
     var tags,keep = []; 
     if (ie === true) 
     { 
      parser.loadXML(xmlString); 
      parsed = parser; 
     } 
     else 
     { 
      parsed = parser.parseFromString(xmlString,'text/xml'); 
     } 
     tags = parsed.getElementsByTagName(getTags); 
     for(i=0;i<tags.length;i++) 
     { 
      if (!getAttr || getAttr === 'textContent') 
      { 
       keep.push(tags[i].textContent); 
       continue; 
      } 
      if (getAttr && tags[i].getAttribute(getAttr)) 
      { 
       keep.push(tags[i].getAttribute(getAttr)); 
      } 
     } 
     keep.push(parsed);//last element of array is the full DOM 
     return keep; 
    } 
})(this);//assuming global declaration, if not: replace with window 
+0

爲什麼你假設OP想要使用DOM函數?他沒有說他在瀏覽器環境中工作。只是在開玩笑:) – wroniasty

+0

@Ootegem:謝謝你的回覆和回覆。我覺得很難理解代碼。有沒有比這更簡單的方法? – user1495475

+1

@ user1495475是的,使用jQuery :) – wroniasty

0

您可以使用jQuery解析XML:

var result1 = $(xmlData1) 
var result2 = $(xmlData2) 

然後你可以使用jQuery搜索/在您的XML中進行比較:

if (result1.find('RNA[A=100]').attr ('x') == result2.find('RNA[B=100]').attr('x')) 
{ 
    //do stuff 
} 
+0

請不要假設jQuery:OP在他的代碼片段中沒有使用jQuery,也沒有包含jQ標籤。 –

+0

這是一個圖書館,完成他想要的東西。他沒有問如何實現XML解析器,只是如何比較兩個XML元素。 – wroniasty

+0

@wroniasty:實際上沒有Elias在這裏,但代碼對於我來說很複雜,我只需要一個小功能。 – user1495475

0

要查找XML差異嘗試使用Pretty Diff。即使屬性是不同的順序,並且白色空間完全不一致,它也會爲您執行所有操作。

下面是你如何做到這一點,沒有花哨的工具。

var comparexml = function (x, y) { 
     var a = (typeof DOMParser === "function") ? true : false, 
      b = [], 
      c = [], 
      d = 0, 
      e = 0, 
      f = 0, 
      g = function() {}, 
      h = {}, 
      i = {}; 
     if (a) { 
      g = new DOMParser(); 
      b = g.parseFromString(x, "application/xml").getElementsByTagName("RNA"); 
      c = g.parseFromString(y, "application/xml").getElementsByTagName("RNA"); 
     } else { 
      g = new ActiveXObject("Microsoft.XMLDOM"); 
      g.async = false; 
      h = g.loadXML(x); 
      i = g.loadXML(y); 
      b = h.getElementsByTagName("RNA"); 
      c = i.getElementsByTagName("RNA"); 
     } 
     d = Math.min(b.length, c.length); 
     for (e = 0; e < d; e += 1) { 
      for (f = 0; f < d; f += 1) { 
       if (b[e].getAttribute("a") === c[f].getAttribute("b")) { 
        if (b[e].getAttribute("x") === c[f].getAttribute("x")) { 
         //your special logic goes in here 
        } 
        break; 
       } 
      } 
     } 
    }; 

該代碼示例可能無法跨瀏覽器工作,因此我再次推薦一個漂亮的工具,比如Pretty Diff。

+0

:謝謝你的回答。但它不適合IE8的工作。請另行通知? – user1495475

+0

我不知道這是否會在IE8中正常工作,但我修改了代碼以支持從activeX控件進行DOM解析。現在就試試。 – austincheney

+0

它成功解析,但在「g.loadXML(x).getElementsByTagName(」RNA「)」行「拋出錯誤,如」對象不支持此屬性或方法「 – user1495475