XML : XML Parsing - XPath expression trying to access xml elements inside second for loop

I have an XML file that I am trying to parse and store as objects so that I can persist them.

  <key>Playlists</key>  <array>      <dict>          <key>Name</key><string>Library</string>          <key>Master</key><true/>          <key>Playlist ID</key><integer>1806</integer>          <key>Playlist Persistent ID</key><string>29E12A03204E0722</string>          <key>Visible</key><false/>          <key>All Items</key><true/>          <key>Playlist Items</key>          <array>              <dict>                  <key>Track ID</key><integer>1234</integer>              </dict>              <dict>                  <key>Track ID</key><integer>1282</integer>              </dict>              <dict>                  <key>Track ID</key><integer>1694</integer>              </dict>              <dict>                  <key>Track ID</key><integer>1558</integer>              </dict>         </array>      </dict>      <dict>          <key>Name</key><string>Music</string>          <key>Playlist ID</key><integer>2687</integer>          <key>Playlist Persistent ID</key><string>29E12A03204E072C</string>          <key>Distinguished Kind</key><integer>4</integer>          <key>Music</key><true/>          <key>All Items</key><true/>          <key>Playlist Items</key>          <array>              <dict>                  <key>Track ID</key><integer>1234</integer>              </dict>              <dict>                  <key>Track ID</key><integer>1282</integer>              </dict>              <dict>                  <key>Track ID</key><integer>1694</integer>              </dict>              <dict>                  <key>Track ID</key><integer>1558</integer>              </dict>         </array>      </dict>    

I'm having trouble accessing the second array. It keeps displaying track Id's from the first array in every playlist.

My java code:

      FileInputStream file = new FileInputStream(new File("itunes2.xml"));      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();      DocumentBuilder builder = factory.newDocumentBuilder();        Document document = builder.parse(file);        Element root = document.getDocumentElement();        ArrayList<Double> tracks = new ArrayList<Double>();        XPath x = XPathFactory.newInstance().newXPath();      NodeList pList = (NodeList)x.evaluate("/plist/dict/array/dict", root, XPathConstants.NODESET);      for (int i = 0; i < pList.getLength(); ++i) {          Element dict = (Element)pList.item(i);          Playlist p = new Playlist();            String name = (String)x.evaluate("key[.='Name']/following-sibling::string[1]", dict, XPathConstants.STRING);          p.setName(name);            Double playlistId = (Double)x.evaluate("key[.='Playlist ID']/following-sibling::integer[1]", dict, XPathConstants.NUMBER);          p.setPlaylistId(playlistId);            String persistentID = (String)x.evaluate("key[.='Playlist Persistent ID']/following-sibling::string[1]", dict, XPathConstants.STRING);          p.setPersistentId(persistentID);            NodeList tList = (NodeList)x.evaluate("/plist/dict/array/dict/array/dict", root, XPathConstants.NODESET);          for (int j = 0; j < 3; ++j) {              Element track = (Element)tList.item(j);                Double trackId = (Double)x.evaluate("key[.='Track ID']/following-sibling::integer[1]", track, XPathConstants.NUMBER);              tracks.add(trackId);              p.setTracks(tracks);          }          Playlist play = new Playlist(name,  persistentID,playlistId, tracks);          System.out.println(play.toString());      }    

It's displaying the information like this:

  Playlist [name=Library, persistentId=29E12A03204E0722, playlistId=1806.0, tracks=[1234.0, 1282.0, 1694.0]]  Playlist [name=Music, persistentId=29E12A03204E072C, playlistId=2687.0, tracks=[1234.0, 1282.0, 1694.0, 1234.0, 1282.0, 1694.0]]    

Could anyone help me with this?

No comments:

Post a Comment