解析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文件?
任何帮助或指针将非常感激!
感谢, 罗斯
下面是加载你指定的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()));
}
}
}
}
非常感谢!这正是我需要并且很好解释的!谢谢 –
@Ross:你也应该接受这个答案。 –
如何使用此代码的android? –
你想从文件中删除它们,或提取它们的代码?你期待什么输出?你从这个URL得到的xml没有什么问题,它的格式很奇怪,但你可以使用'xmlstarlet fo -s 2 file.xml'来重新格式化它,这样你就可以更好地理解它的布局。 –
我想从XML文件中提取歌曲和艺术家的名字,但我不确定是否热门来处理这个奇怪格式的文件? –