解析XML Last.Fm从API在Java中

问题描述:

网址:http://ws.audioscrobbler.com/2.0/?method=chart.gethypedtracks&api_key=1732077d6772048ccc671c754061cb18&limit=10解析XML Last.Fm从API在Java中

从上面的网址我需要以某种方式去除艺术家姓名,并从给定的每首乐曲生成的XML文件的曲目名称,但我不知道如何以这种方式构建XML文件?

任何帮助或指针将非常感激!

感谢, 罗斯

+0

你想从文件中删除它们,或提取它们的代码?你期待什么输出?你从这个URL得到的xml没有什么问题,它的格式很奇怪,但你可以使用'xmlstarlet fo -s 2 file.xml'来重新格式化它,这样你就可以更好地理解它的布局。 –

+0

我想从XML文件中提取歌曲和艺术家的名字,但我不确定是否热门来处理这个奇怪格式的文件? –

下面是加载你指定的URL和解析跟踪和艺术家名称完全工人阶级。

基本上它将xml读入Document,并在循环中运行2个xpath查询以获取所需的数据。

本身是简单的XML,如果您重新格式化它,它看起来像该文件:

<?xml version="1.0" encoding="utf-8"?> 
<lfm status="ok"> 
    <tracks page="1" perPage="10" totalPages="50" total="500"> 
    <track> 
     <name>Hysterical</name> 
     <duration>231</duration> 
     <percentagechange>3626</percentagechange> 
     <mbid/> 
     <url>http://www.last.fm/music/Clap+Your+Hands+Say+Yeah/_/Hysterical</url> 
     <streamable fulltrack="0">0</streamable> 
     <artist> 
     <name>Clap Your Hands Say Yeah</name> 
     ... 

我所做的一切把它清理​​干净是像xmlstarlet通过重新格式化运行它,因为我在我的评论中提到。注意:如果格式正确,则不必重新格式化它以供java读取。人类可读是所有格式都适合你的。

第一个xpath查询使用路径lfm/tracks/track/name获取曲目名称。你可以使用像this xpath tester这样的东西来尝试你的xpath查询(你可以粘贴你的xml,它也会重新格式化它)。如果你不懂xpath,网上有很多来源。

第二个xpath相对于当前曲目名称节点起作用,并寻找following-sibling类型的artist节点和name子节点,然后显示该节点的文本。

这里的

package net.fish; 

import java.net.URL; 
import java.net.URLConnection; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathConstants; 
import javax.xml.xpath.XPathExpression; 
import javax.xml.xpath.XPathFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

public class ParseXML { 

    private static final DocumentBuilderFactory DOCUMENT_BUILDER_FACTORY = DocumentBuilderFactory.newInstance(); 
    private static final XPathFactory XPATH_FACTORY = XPathFactory.newInstance(); 

    public static void main(String[] args) throws Exception { 
     new ParseXML().parseXml("http://ws.audioscrobbler.com/2.0/?method=chart.gethypedtracks&api_key=1732077d6772048ccc671c754061cb18&limit=10"); 
    } 

    private void parseXml(String urlPath) throws Exception { 
     URL url = new URL(urlPath); 
     URLConnection connection = url.openConnection(); 
     DocumentBuilder db = DOCUMENT_BUILDER_FACTORY.newDocumentBuilder(); 

     final Document document = db.parse(connection.getInputStream()); 
     XPath xPathEvaluator = XPATH_FACTORY.newXPath(); 
     XPathExpression nameExpr = xPathEvaluator.compile("lfm/tracks/track/name"); 
     NodeList trackNameNodes = (NodeList) nameExpr.evaluate(document, XPathConstants.NODESET); 
     for (int i = 0; i < trackNameNodes.getLength(); i++) { 
      Node trackNameNode = trackNameNodes.item(i); 
      System.out.println(String.format("Track Name: %s" , trackNameNode.getTextContent())); 
      XPathExpression artistNameExpr = xPathEvaluator.compile("following-sibling::artist/name"); 
      NodeList artistNameNodes = (NodeList) artistNameExpr.evaluate(trackNameNode, XPathConstants.NODESET); 
      for (int j=0; j < artistNameNodes.getLength(); j++) { 
       System.out.println(String.format(" - Artist Name: %s", artistNameNodes.item(j).getTextContent())); 
      } 
     } 
    } 
} 
+0

非常感谢!这正是我需要并且很好解释的!谢谢 –

+0

@Ross:你也应该接受这个答案。 –

+0

如何使用此代码的android? –