0

我试图通过将其与另一个 xml进行比较来获取 xml 的属性值,如下所示:

xmlData1变量具有类似 xml 的 --->

<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

如何实现这个???请帮助

4

3 回答 3

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
}
于 2012-09-18T11:00:39.493 回答
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。

于 2012-09-18T11:34:47.107 回答
-1

合理简单。首先,您解析 xml。实际上,我已经整合了一个 X 浏览器功能,可以很好地满足您的需求。你可以在这里找到它
取消注释这一行:

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
于 2012-09-18T11:06:05.477 回答