Solved

get specific Data from xml field

Posted on 2014-03-24
2
280 Views
Last Modified: 2014-03-24
Ok I have a html page player image and xml file attached. What I need to solve this is to grab from the xml file a node called pitcher it's located in the beginning of the file I need  to grab Firstname and Lastname and ID that will be used for a head shot.
<Pitcher ID="1770" TeamID="007" FirstName="Kyle " Lastname="Farnsworth" Inning="6" Outs="1" Throws="R" BBats="S" AB="1" BF="1"/> if you can pull this name and headshot  player ID you have succeeded if like the page pulls Zack Wheeler not working right. Because there are 2 Pitcher's list Current pitcher after score then at the end of the xml pitchers a list of games pitchers.

here is the code Thanks EE

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
<link rel="stylesheet" href="css/jquery-ui-1.8.9.customver1.css">
<style type="text/css">
.GCPBP {
    color: white;
}
#apDiv1 {
    position: absolute;
    width: 17px;
    height: 28px;
    z-index: 10;
    left: 218px;
    top: 368px;
}
#apDiv2 {
    position: absolute;
    width: 16px;
    height: 34px;
    z-index: 20;
    left: 197px;
    top: 368px;
}
#apDiv3 {
    position: absolute;
    width: 21px;
    height: 30px;
    z-index: 25;
    left: 197px;
    top: 308px;
}
#apDiv4 {
    position: absolute;
    width: 17px;
    height: 33px;
    z-index: 30;
    left: 289px;
    top: 295px;
}
#apDiv5 {
    position: absolute;
    width: 16px;
    height: 33px;
    z-index: 35;
    left: 320px;
    top: 303px;
}
#apDiv6 {
    position: absolute;
    width: 19px;
    height: 32px;
    z-index: 40;
    left: 225px;
    top: 276px;
}
#apDiv7 {
    position: absolute;
    width: 24px;
    height: 38px;
    z-index: 45;
    left: 173px;
    top: 261px;
}
#apDiv8 {
    position: absolute;
    width: 14px;
    height: 37px;
    z-index: 46;
    left: 136px;
    top: 268px;
}
#apDiv9 {
    position: absolute;
    width: 21px;
    height: 32px;
    z-index: 50;
    left: 99px;
    top: 282px;
}
#apDiv10 {
    position: absolute;
    width: 20px;
    height: 38px;
    z-index: 55;
    left: 67px;
    top: 290px;
}
#apDiv11 {
    position: absolute;
    width: 17px;
    height: 37px;
    z-index: 60;
    left: 321px;
    top: 254px;
}
#apDiv12 {
    position: absolute;
    width: 19px;
    height: 35px;
    z-index: 65;
    left: 205px;
    top: 235px;
}
#apDiv13 {
    position: absolute;
    width: 18px;
    height: 37px;
    z-index: 70;
    left: 69px;
    top: 244px;
}
#P,#C,#FB,#SB,#SS,#TB,#LF,#CF,#RF , #HPUmpire,#TBUmpire,#SBUmpire,#FBUmpire {
    /*border: 1px solid white;*/
}
</style>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js" type="text/javascript"></script>
 
<script type="text/javascript">
    var xmlPath = '.';//'/xml/mlb/scores/real';
  var xmlGameID = '41880';
  var srcFieldTeamLogo;
  //var playerImage;
var txtpitcher;
//var pitcherid;
  var intPosID = {
    'P': {
        pos: 'Pitcher',
        id: 0,
        name: 'unknown'
    },
    'C': {
        pos: 'Catcher',
        id: 0,
        name: 'unknown'
    },
    'FB': {
        pos: 'First Base',
        id: 0,
        name: 'unknown'
    },
    'SB': {
        pos: 'Second Base',
        id: 0,
        name: 'unknown'
    },
    'SS': {
        pos: 'ShortStop',
        id: 0,
        name: 'unknown'
    },
    'TB': {
        pos: 'Third Base',
        id: 0,
        name: 'unknown'
    },
    'LF': {
        pos: 'Left Field',
        id: 0,
        name: 'unknown'
    },
    'CF': {
        pos: 'Center Field',
        id: 0,
        name: 'unknown'
    },
    'RF': {
        pos: 'Right Field',
        id: 0,
        name: 'unknown'
    },
    'HPUmpire': {
        pos: 'Home Plate Umpire',
        id: 0,
        name: 'unknown'
    },
    'TBUmpire': {
        pos: 'Third Base Umpire',
        id: 0,
        name: 'unknown'
    },
    'SBUmpire': {
        pos: 'Second Base Umpire',
        id: 0,
        name: 'unknown'
    },
    'FBUmpire': {
        pos: 'First Base Umpire',
        id: 0,
        name: 'unknown'
    }
  };
 
 
stadiums = {
    "wrigley field":"wrigley.gif",
    "comerica park":"comerica.gif" ,
    "yankee stadium":"yankee.jpg" ,
    "shea stadium":"shea.jpg" ,
    "angel stadium of anaheim":"angel.jpg" ,
    "rangers ballpark in arlington":"angel.jpg" ,
    "at&t park":"attpark.jpg" ,
    "citizens bank park":"citizenballpark.jpg" ,
    "coors field":"coors.jpg" ,
    "busch stadium":"busch.jpg" ,
    "oriole park at camden yards":"camden_baltimore.jpg",
    "dodger stadium":"dodgers.jpg" ,
    "chase field":"chasefield.jpg" ,
    "tropicana field":"tropicana.jpg" ,
    "great american ball park":"greatamerican.jpg" ,
    "kauffman stadium":"kauffmanstadium.jpg" ,
    "mcafee coliseum":"mcafeecoliseum.jpg" ,
    "hubert h. humphrey metrodome":"metrodome.jpg" ,
    "metrodome":"metrodome.jpg" ,
    "miller park":"millerpark.jpg" ,
    "minute maid park":"minutemaid.jpg" ,
    "nationals park":"nationalspark.jpg" ,
    "petco park":"petcopark.jpg" ,
    "pnc park":"pncpark.jpg" ,
    "progressive field":"progressive.jpg" ,
    "rogers centre":"rogerscentre.jpg" ,
    "safeco field":"safecofield.jpg" ,
    "turner field":"turnerfield.jpg" ,
    "dolphin stadium":"dolphinstadium.jpg" ,
    "fenway park":"fenwaypark.jpg" ,
    "u.s. cellular field":"uscellularfield.jpg" ,
    "oakland-alameda county coliseum":"mcafeecoliseum.jpg",
    "marlins park":"marlins.jpg",
    "citi field":"citifield.jpg",
 
     "target field":"targetfield.jpg"
}; // no comma on the last
 
var homeTurf = {
    "minnesota":"target field",
  "philadelphia":"citizens bank park",
  "milwaukee":"miller park",
  "san francisco":"u.s. cellular field",
  "la angels":"angel stadium of anaheim",
  "tampa bay":"tropicana field",
  "chicago wsox":"u.s. cellular field",
  "oakland":"oakland-alameda county coliseum",
  "kansas city":"kauffman stadium",
  "los angeles":"dodger stadium",
  "san diego":"petco park",
  "boston":"fenway park",
  "seattle":"safeco field",
  "detroit":"comerica park",
  "atlanta":"turner field",
  "baltimore":"oriole park at camden yards",
  "miami":"marlins park",
  "pittsburgh":"pnc park",
  "ny mets":"citi field",
  "st. louis":"busch stadium",
  "houston":"minute maid park",
  "cleveland":"progressive field",
  "cincinnati":"great american ball park",
  "texas":"rangers ballpark in arlington",
  "toronto":"rogers centre",
  "chicago cubs":"wrigley field",
  "arizona":"chase field",
  "colorado":"coors field",
  "ny yankees":"yankee stadium",
  "washington":"nationals park"
};
 
$(document).ready(function(){
    $.ajax({
        type: "GET",
        url: xmlPath+"/"+xmlGameID+".xml",
 
        dataType: "xml",
        success: function(data){
            var d = $(data);
            var Play = d.find('Play');
            var Teams = $(data).find("Team");
 
            $.each(Teams,function(i,Team) {
 
 
                team=$(Team);
                var id = team.attr("ID").toLowerCase();
                var homeOrAway = team.attr("vh");
 
                $(homeOrAway=="H" ? '#imghometeam' : '#imgawayteam').attr('src', 'http://sportsnetwork.com/MLB/MLB/' + id + ".png");
 
                var name = team.attr("name").toLowerCase();
 
                if (homeOrAway=="H") {
                    var stadium_location = stadiums[homeTurf[name]]; // or have
                    var url = "http://images.sportsnetwork.com/mlb/attheballpark/stadiums/";
                    url = (stadium_location) ?url + stadium_location:"default.gif";
                    $("#imgStad").attr("src",url);
                }
 
                var loc = Play.attr('Location') ;
                //var locate = "Location" + $('#txtBallparkname').html(loc).toUpperCase;
                $('#txtBallparkname').html("Location " + loc.toUpperCase());
 
            });
        }
    });
 
    $('#P,#C,#FB,#SB,#SS,#TB,#LF,#CF,#RF').hover(function(){
        $('#playerImage').attr('src', 'http://images.sportsnetwork.com/MLB/attheballpark/players/'+intPosID[this.id].id+'.jpg');
        $('#PlayerName').html(intPosID[this.id].name);
        $('#PositionName').html(intPosID[this.id].pos);
    },function() {
        $('#playerImage').attr('src', 'http://sportsnetwork.com/gamecast/mlb/Images/blank.png');
        $('#PlayerName').html('&nbsp;');
        $('#PositionName').html('&nbsp;');
    });
 
    $('#HPUmpire,#TBUmpire,#SBUmpire,#FBUmpire').hover(function(){
        $('#playerImage').attr('src', 'http://images.sportsnetwork.com/MLB/attheballpark/umpires/'+intPosID[this.id].id+'.jpg');
        $('#PlayerName').html(intPosID[this.id].name);
        $('#PositionName').html(intPosID[this.id].pos);
    },function() {
        $('#playerImage').attr('src', 'http://sportsnetwork.com/gamecast/mlb/Images/blank.png');
        $('#PlayerName').html('&nbsp;');
        $('#PositionName').html('&nbsp;');
    });
 
});
 
 
function loadAll() {
 
    $.ajax({
        type: "GET",
        url: xmlPath+"/"+xmlGameID+".xml",
 
        dataType: "xml",
        success: function(data){
            var d = $(data);
            if (d.find('Play').attr("Status").toUpperCase() === "FINAL") {
                clearInterval(myVar);
            }
            var colNodes = d.find('Play').children();
 
            for (var i=0; i < colNodes.length; i++) {
                var objNode = colNodes[i];
                //document.getElementById("demo").innerHTML += '/'+objNode.nodeName;
                switch(objNode.nodeName) {
                    case 'Batter':
                        txtBatter = $(objNode).attr('FirstName') + ' ' + $(objNode).attr('Lastname');
                        intBatter = $(objNode).attr('ID');
 
                        intBatterSave = intBatter;
 
                        break;
                    case 'Pitcher':
                        txtPitcher = $(objNode).attr('FirstName') + ' ' + $(objNode).attr('Lastname');
                        intPitcher = $(objNode).attr('ID');
 
                        break;
 
                }
            }
    //  if (d.find('Play').attr("NoPlay").toUpperCase() === '1') {
     //   $('#txtBallparkname').html("Rain Delay");
 
     //   clearInterval(myVar);
    //  }
      // if (d.find('Play').attr("NoPlay").toUpperCase() === '0') {
 
 
      //  setInterval(myVar);
     // }
            for (var posItem in intPosID) {
                posItem.updated = false;
            }
 
            $(d.find('Pitcher')).each(function(i, nodePlayer){ // always 1!
                nodePlayer = $(nodePlayer);
                var posItem = intPosID['P'];
                if (posItem) { // && !posItem.updated
                    posItem.id = nodePlayer.attr('ID');
                    posItem.name = nodePlayer.attr('FirstName') + ' ' + nodePlayer.attr('Lastname');
                    posItem.updated = true;
                    //tempCount++;
                }
            });
 
            $(d.find('Fielders')).find('Player').each(function(indexPlayer, nodePlayer){
                nodePlayer = $(nodePlayer);
                var posItem = intPosID[nodePlayer.attr('Pos').trim().replace('1B', 'FB').replace('2B', 'SB').replace('3B', 'TB')];
                if (posItem) {
                    posItem.id = nodePlayer.attr('ID');
                    posItem.name = nodePlayer.attr('FirstName') + ' ' + nodePlayer.attr('Lastname');
                    posItem.updated = true;
                } else {
                    //console.log('invalid player positem: ' + nodePlayer.attr('Pos'));
                }
            });
            $(d.find('Umpires')).find('*').each(function(indexUmpire, nodeUmpire){
                nodeUmpire = $(nodeUmpire);
                var posItem = intPosID[nodeUmpire.prop('nodeName')];
                if (posItem) {
                    posItem.id = nodeUmpire.attr('ID');
                    posItem.name = nodeUmpire.text();
                    posItem.updated = true;
                } else {
                    //console.log('invalid umpire positem: ' + nodeUmpire.prop('nodeName'));
                }
            });
 
            /*
            var tempCount = 0;
            for (var posItem in intPosID) {
                if (!posItem.updated) {
                    tempCount++;
                }
            }
            $('#txtBallparkname').html('temp debug: ' + tempCount + ' items NOT updated');
            */
 
            var tempCount = 0;
 
            var intPitcherTeamID = d.find('Pitcher').attr('TeamID');
            var intBatterTeamID = d.find('Batter').attr('TeamID');
            $('#imgawayteam').attr('src', 'http://images.sportsnetwork.com/MLB/attheballpark/MLB/' +intBatterTeamID + ".png");
            $('#imghometeam').attr('src', 'http://images.sportsnetwork.com/MLB/attheballpark/MLB/' + intPitcherTeamID + ".png");
            // BattersSameTeamAsPitcher
            $(d.find('Batters[TeamID="' + intPitcherTeamID + '"]')).find('Player').each(function(i, nodePlayer){
                nodePlayer = $(nodePlayer);
                var posPlayer = nodePlayer.attr('Pos').replace('1B', 'FB').replace('2B', 'SB').replace('3B', 'TB');
                var posItem = intPosID[posPlayer];
                if (posItem) { // && !posItem.updated
                    posItem.id = nodePlayer.attr('ID');
                    posItem.name = nodePlayer.attr('FirstName') + ' ' + nodePlayer.attr('Lastname');
                    posItem.updated = true;
                    tempCount++;
                }
            });
            //$('#txtBallparkname').html('temp debug: ' + tempCount + ' items extra updated!');
 
 
            var Fielder = $(d.find('Fielders').find('Player:first'));
            var Team = $(d.find("Team[ID='" + Fielder.attr('TeamID') + "']"));
            var unfrm = Team.attr('Uniform'); // +'.gif';
            $('#P,#C,#FB,#SB,#SS,#TB,#LF,#CF,#RF').attr('src', 'http://images.sportsnetwork.com/MLB/attheballpark/pbp_logos/'+unfrm);
            //srcFieldTeamLogo = 'http://images.sportsnetwork.com/MLB/attheballpark/pbp_logos/'+Team.attr('ID')+'.png';
            //var d = $(data);
            //var Pitchers = $(d.find('Batters').find('Player:first'));
            ///var Team = $(d.find("Team[ID='" + Batter.attr('TeamID') + "']"));
            //var unfrm = Team.attr('Uniform');
            //var bat = Batter.attr("Bats");
 
            //if (srcFieldTeamLogo != "") $('#srcFieldTeamLogo').attr('src', srcFieldTeamLogo);
 
        }
    })
}
</script>
</head>
 
<body bgcolor="#000000" class="GCPBP">
 
<table width="100%" border="0">
  <tr>
    <td><strong class="GCPBP" id="txtBallparkname">BallParkname</strong></td>
  </tr>

</table>
<table width="400" border="0">
  <tr>
    <td><table width="400" border="0">
      <tr>
        <td width="67" rowspan="4"><p><img src="BBLogo.png" alt="" name="imghometeam" width="78" height="76" id="imghometeam"></p></td>
        <td width="81" rowspan="4"><img src="Images/Blank.png" alt="" width="73" height="75" id="playerImage"></td>
        <td width="156"><Pitcher ID="1770" TeamID="007" FirstName="Kyle " Lastname="Farnsworth" Inning="6" Outs="1" Throws="R" BBats="S" AB="1" BF="1"/>&nbsp;</td>
        <td width="78" rowspan="4"><img src="BBLogo.png" name="imgawayteam" width="78" height="76" id="imgawayteam"></td>
      </tr>
      <tr>
        <td class="PlayerName"><div align="center" id="PlayerName">Player Name</div></td>
      </tr>
      <tr>
        <td><div align="center" class="GCPBP"></div></td>
      </tr>
      <tr>
        <td class="PositionName"><div align="center" id="PositionName">Position Name</div></td>
      </tr>
    </table>
      <table width="400" border="0">
        <tr>
          <td><div id="apDiv1"><img src="Images/Uniforms/umpire.gif" alt="" name="HPUmpire" width="11" height="30" id="HPUmpire"></div>            <div id="apDiv2"><img src="Images/Uniforms/040_unif_awayold.gif" alt="" name="C" width="11" height="30" id="C"></div>            <div id="apDiv6"><img src="Images/Uniforms/040_unif_awayold.gif" alt="" name="SB" width="11" height="30" id="SB"></div>
            <div id="apDiv7"><img src="Images/Uniforms/umpire.gif" alt="" name="SBUmpire" width="11" height="30" id="SBUmpire"></div>
            <div id="apDiv8"><img src="Images/Uniforms/040_unif_awayold.gif" alt="" name="SS" width="11" height="30" id="SS"></div>
            <div id="apDiv9"><img src="Images/Uniforms/040_unif_awayold.gif" alt="" name="TB" width="11" height="30" id="TB"></div>
            <div id="apDiv10"><img src="Images/Uniforms/umpire.gif" alt="" name="TBUmpire" width="11" height="30" id="TBUmpire"></div>
            <div id="apDiv12"><img src="Images/Uniforms/040_unif_awayold.gif" alt="" name="CF" width="11" height="30" id="CF"></div>
            <div id="apDiv13"><img src="Images/Uniforms/040_unif_homeold.gif" alt="" name="RF" width="11" height="30" id="RF"></div>
            <img src="http://images.sportsnetwork.com/mlb/attheballpark/stadiums/default.gif" name="imgStad" width="390" height="273" id="imgStad">
            <div id="apDiv11"><img src="Images/Uniforms/040_unif_awayold.gif" alt="" name="LF" width="11" height="30" id="LF"></div>
            <div id="apDiv5"><img src="Images/Uniforms/umpire.gif" alt="" name="FBUmpire" width="11" height="30" id="FBUmpire"></div>
            <div id="apDiv4"><img src="Images/Uniforms/040_unif_awayold.gif" alt="" name="FB" width="11" height="30" id="FB"></div>
            <div id="apDiv3"><img src="Images/Uniforms/040_unif_awayold.gif" alt="" name="P" width="11" height="30" id="P"></div>
          </td>
        </tr>
      </table>
      <p align="center">&nbsp;</p>
   </td>
  </tr>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="GCPBP">&nbsp; </p>
<script>
var myVar = setInterval(myTimer,2000);
 
function myTimer()
{
    //var d=new Date();
    //var t=d.toLocaleTimeString();
    //document.getElementById("demo").innerHTML=t;
    loadAll();
}
  </script>
</body>
</html>

Open in new window




This is the 2nd pitchers list not current pitcher this will pull Zack Wheller as pitcher and not current pitcher
<Pitcher ID="1770" TeamID="007" FirstName="Kyle " Lastname="Farnsworth" Inning="6" Outs="1" Throws="R" BBats="S" AB="1" BF="1"/>

 $(d.find('Pitcher')).each(function(i, nodePlayer){ // always 1!
                nodePlayer = $(nodePlayer);
                var posItem = intPosID['P'];
                if (posItem) { // && !posItem.updated
                    posItem.id = nodePlayer.attr('ID');
                    posItem.name = nodePlayer.attr('FirstName') + ' ' + nodePlayer.attr('Lastname');
                    posItem.updated = true;
                    //tempCount++;
                }
            });

Open in new window

41880.XML
fieldplayers.html
040-unif-home.gif
0
Comment
Question by:powerztom
2 Comments
 
LVL 35

Accepted Solution

by:
Robert Schutt earned 500 total points
Comment Utility
This was a tough one! Although I must admit it was partly because I just didn't understand your explanation in the previous question.

I removed lines 372 - 438 and added this:
            $(d.find('Pitcher')).each(function(i, nodePlayer){ // always 1!
                nodePlayer = $(nodePlayer);
                var posItem = intPosID['P'];
                if (posItem) {
                    posItem.id = nodePlayer.attr('ID');
                    posItem.name = nodePlayer.attr('FirstName') + ' ' + nodePlayer.attr('Lastname');
                    console.log('Pitcher id: ' + posItem.id + ', pos: P, name: ' + posItem.name);
                }
            });

            $(d.find('Fielders')).find('Player:not([Pos^="P"])').each(function(indexPlayer, nodePlayer){
                nodePlayer = $(nodePlayer);
                var posItem = intPosID[nodePlayer.attr('Pos').trim().replace('1B', 'FB').replace('2B', 'SB').replace('3B', 'TB')];
                if (posItem) {
                    posItem.id = nodePlayer.attr('ID');
                    posItem.name = nodePlayer.attr('FirstName') + ' ' + nodePlayer.attr('Lastname');
                    console.log('Fielder id: ' + posItem.id + ', pos: ' + nodePlayer.attr('Pos').trim() + ', name: ' + posItem.name);
                }
            });

            $(d.find('Umpires')).find('*').each(function(indexUmpire, nodeUmpire){
                nodeUmpire = $(nodeUmpire);
                var posItem = intPosID[nodeUmpire.prop('nodeName')];
                if (posItem) {
                    posItem.id = nodeUmpire.attr('ID');
                    posItem.name = nodeUmpire.text();
                    console.log('Umpire id: ' + posItem.id + ', pos: ' + nodeUmpire.prop('nodeName') + ', name: ' + posItem.name);
                }
            });

            var intPitcherTeamID = d.find('Pitcher').attr('TeamID');
            var intBatterTeamID = d.find('Batter').attr('TeamID');
            $('#imgawayteam').attr('src', 'http://images.sportsnetwork.com/MLB/attheballpark/MLB/' +intBatterTeamID + ".png");
            $('#imghometeam').attr('src', 'http://images.sportsnetwork.com/MLB/attheballpark/MLB/' + intPitcherTeamID + ".png");

            $(d.find('Batters[TeamID="' + intPitcherTeamID + '"]')).find('Player:not([Pos="P"])').each(function(i, nodePlayer){
                nodePlayer = $(nodePlayer);
                var posPlayer = nodePlayer.attr('Pos').replace('1B', 'FB').replace('2B', 'SB').replace('3B', 'TB');
                var posItem = intPosID[posPlayer];
                if (posItem) {
                    posItem.id = nodePlayer.attr('ID');
                    posItem.name = nodePlayer.attr('FirstName') + ' ' + nodePlayer.attr('Lastname');
                    console.log('Batter id: ' + posItem.id + ', pos: "' + nodePlayer.attr('Pos') + '", name: ' + posItem.name);
                }
            });

Open in new window

I removed the 'updated' flag because it wasn't used anymore (only for some logging before). I added some logging to the console to see the player nodes being found (I left it in because you should have a look at it in the debugger, when you see the logic, you can comment out those lines with "console.log(...)").

Player info is duplicated in several places in the xml file and that's why the other pitcher was being found! So now they are being excluded from the Fielders and Batters loops in the jQuery selectors using :not([Pos="P"])
0
 

Author Closing Comment

by:powerztom
Comment Utility
Rob,

This is your birthday present to me. You never disappoint.Thank You.
0

Featured Post

Find Ransomware Secrets With All-Source Analysis

Ransomware has become a major concern for organizations; its prevalence has grown due to past successes achieved by threat actors. While each ransomware variant is different, we’ve seen some common tactics and trends used among the authors of the malware.

Join & Write a Comment

Suggested Solutions

Browsing the questions asked to the Experts of this forum, you will be amazed to see how many times people are headaching about monster regular expressions (regex) to select that specific part of some HTML or XML file they want to extract. The examp…
This article describes how to create custom column layout styles for Bootstrap. The article uses 5 columns to illustrate the concept, but the principle can be extended to any number of columns.
The purpose of this video is to demonstrate how to set up the WordPress backend so that each page automatically generates a Mailchimp signup form in the sidebar. This will be demonstrated using a Windows 8 PC. Tools Used are Photoshop, Awesome…
The viewer will learn the benefit of using external CSS files and the relationship between class and ID selectors. Create your external css file by saving it as style.css then set up your style tags: (CODE) Reference the nav tag and set your prop…

763 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

6 Experts available now in Live!

Get 1:1 Help Now