从XML中仅选择特定的国家/地区值

时间:2012-02-17 07:56:29

标签: javascript jquery xml ajax

我有这种格式的XML Feed:

<Country Name="ALBANIA">
    <Destination Name="TIRANA">
        <Destination_1>TIR</Destination_1>
        <Destination_2/>
        <Destination_3/>
    </Destination>
</Country>
<Country Name="AUSTRALIA">
    <Destination Name="ADELAIDE">
        <Destination_1>ADL</Destination_1>
        <Destination_2/>
        <Destination_3/>
    </Destination>
    <Destination Name="ALICE SPRINGS">
        <Destination_1>ASP</Destination_1>
        <Destination_2/>
        <Destination_3/>
    </Destination>
    <Destination Name="BRISBANE">
        <Destination_1>BNE</Destination_1>
        <Destination_2/>
        <Destination_3/>
    </Destination>
    <Destination Name="CAIRNS">
        <Destination_1>CNS</Destination_1>
        <Destination_2/>
        <Destination_3/>
    </Destination>
    <Destination Name="DARWIN">
        <Destination_1>DRW</Destination_1>
        <Destination_2/>
        <Destination_3/>
    </Destination>
    <Destination Name="GOLD COAST">
        <Destination_1>OOL</Destination_1>
        <Destination_2/>
        <Destination_3/>
    </Destination>
    <Destination Name="HOBART">
        <Destination_1>HBA</Destination_1>
        <Destination_2/>
        <Destination_3/>
    </Destination>
    <Destination Name="MELBOURNE">
        <Destination_1>MEL</Destination_1>
        <Destination_2/>
        <Destination_3/>
    </Destination>
    <Destination Name="PERTH">
        <Destination_1>PER</Destination_1>
        <Destination_2/>
        <Destination_3/>
    </Destination>
    <Destination Name="SYDNEY">
        <Destination_1>SYD</Destination_1>
        <Destination_2/>
        <Destination_3/>
    </Destination>
</Country>

现在,我要做的是仅从ALBANIA中选择目的地,并将它们发布为这样的链接:

<p><a href="TIR.html">TIRANA</a> in ALBANIA</p>

使用XML值,链接应该如下所示

<p><a href="{{Destination_1}}.html">{{Destination Name}}</a> in {{Country Name}}</p>

我能够为所有国家/地区创建列表,但我不知道如何仅显示一个国家/地区的值。

这是列出所有项目的代码

$.ajax({
                type: "GET",
                url: "test.xml",
                dataType: "xml",
                success: function(xml) {
                    $(xml).find('Country').each(function(){
                        var countryName = $(this).attr('Name');
                        if (countryName = localStorage.ArrivalCountry) {
                            var destinationName = $(this).find('Destination').attr('Name');
                            $('<a class="listItem" href="#" id="'+destinationName+'">'+destinationName+'<div class="arrow"></div></a>').appendTo('#destinationList');
                        }


                    });
                }
            });

2 个答案:

答案 0 :(得分:1)

不确定你是如何计划使用它,遍历所有国家?,循环遍布给定国家/地区的所有目的地?如果您希望获得更多帮助,请在问题中添加更多信息。

这些简单的xpath为您提供了所需的节点。

此XPath为您提供Name = ALBANIA

的整个国家/地区节点
//Country[@Name = 'ALBANIA']

这为您提供了您希望从中提取Name属性(TIRANA)的目标节点:

//Country[@Name = 'ALBANIA']/Destination

这将为您提供Destination_1节点,您希望从中提取文本“TIR”

//Country[@Name = 'ALBANIA']/Destination/Destination_1

答案 1 :(得分:0)

首先,我建议您不要调用目标元素Destination_1,Destination_2等。仅将其称为目的地并呼叫父目的地,即:。

<Destinations>
    <Destination></Destination>
    <Destination></Destination>
    <Destination></Destination>
</Destination>

我没有更改XML,但这只是一个如何使用jquery导航XML的小例子:

<html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
</head>
<BODY>

<script type="text/javascript">
// need to add a root to the xml for it to be valid
var xml = $.parseXML('<root><Country Name="ALBANIA">' +
'    <Destination Name="TIRANA">' +
'        <Destination_1>TIR</Destination_1>' +
'        <Destination_2/>' +
'        <Destination_3/>' +
'    </Destination>' +
'</Country>' +
'<Country Name="AUSTRALIA">' +
'    <Destination Name="ADELAIDE">' +
'        <Destination_1>ADL</Destination_1>' +
'        <Destination_2/>' +
'        <Destination_3/>' +
'    </Destination>' +
'    <Destination Name="ALICE SPRINGS">' +
'        <Destination_1>ASP</Destination_1>' +
'        <Destination_2/>' +
'        <Destination_3/>' +
'    </Destination>' +
'    <Destination Name="BRISBANE">' +
'        <Destination_1>BNE</Destination_1>' +
'        <Destination_2/>' +
'        <Destination_3/>' +
'    </Destination>' +
'    <Destination Name="CAIRNS">' +
'        <Destination_1>CNS</Destination_1>' +
'        <Destination_2/>' +
'        <Destination_3/>' +
'    </Destination>' +
'    <Destination Name="DARWIN">' +
'        <Destination_1>DRW</Destination_1>' +
'        <Destination_2/>' +
'        <Destination_3/>' +
'    </Destination>' +
'    <Destination Name="GOLD COAST">' +
'        <Destination_1>OOL</Destination_1>' +
'        <Destination_2/>' +
'        <Destination_3/>' +
'    </Destination>' +
'    <Destination Name="HOBART">' +
'        <Destination_1>HBA</Destination_1>' +
'        <Destination_2/>' +
'        <Destination_3/>' +
'    </Destination>' +
'    <Destination Name="MELBOURNE">' +
'        <Destination_1>MEL</Destination_1>' +
'        <Destination_2/>' +
'        <Destination_3/>' +
'    </Destination>' +
'    <Destination Name="PERTH">' +
'        <Destination_1>PER</Destination_1>' +
'        <Destination_2/>' +
'        <Destination_3/>' +
'    </Destination>' +
'    <Destination Name="SYDNEY">' +
'        <Destination_1>SYD</Destination_1>' +
'        <Destination_2/>' +
'        <Destination_3/>' +
'    </Destination>' +
'</Country></root>');
// looping the xml
for (var i=0; i<xml.childNodes[0].childNodes.length; i++)
{
    var country = xml.childNodes[0].childNodes[i];
    //alert(country.getAttribute('Name'));

    // ... continue to loop the childNodes (destination) of country
    for (var j=0; j<country.childNodes.length; j++)
    {
        // ...
    }
}

// means you can easily (you can probably figure out the specifics):
var countries = xml.childNodes[0];
var australia = null;
$.each(countries.childNodes, function() {
    if (this.getAttribute('Name') == 'AUSTRALIA')
    {
        australia = this;
        return false;
    }
});

console.log(australia);

// get a list to loop for all destinations
australia = $(countries).find('Country[Name="AUSTRALIA"]');
var destinations = australia.find('Destination');
console.log(destinations);

</script>
</BODY>
</html>