java - java中的XML解析: how to get info out of a tag adjacent to a tag with a certain value?

标签 java xml parsing dom

我正在尝试从 XML 文件中获取信息,并使用该信息来创建对象。问题在于 XML 文件中的每个标签都是 dict、key 或数据类型标签(如整数和字符串)。使用这些模糊的标签名称,我发现很难指定我想要的数据。

我意识到我并不是以最好的方式问这个问题,但我是一个完全的初学者,不知道从哪里开始,任何帮助将不胜感激。

这是我试图从中解析的文件:

  <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Major Version</key><integer>1</integer>
    <key>Minor Version</key><integer>1</integer>
    <key>Date</key><date>2012-10-27T17:24:27Z</date>
    <key>Application Version</key><string>10.7</string>
    <key>Features</key><integer>5</integer>
    <key>Show Content Ratings</key><true/>
    <key>Music Folder</key><string>file://localhost/C:/Users/andrea/Music/iTunes/iTunes%20Media/</string>
    <key>Library Persistent ID</key><string>69A7F174F7AEE335</string>
    <key>Tracks</key>
    <dict>
        <key>2651</key>
        <dict>
            <key>Track ID</key><integer>2651</integer>
            <key>Name</key><string>Munastero 'e Santa Chiara</string>
            <key>Artist</key><string>A.M.P</string>
            <key>Composer</key><string>Barberis A., Galvieri</string>
            <key>Album</key><string>Bella Napoli</string>
            <key>Genre</key><string>World</string>
            <key>Kind</key><string>File audio AAC</string>
            <key>Size</key><integer>2378728</integer>
            <key>Total Time</key><integer>149520</integer>
            <key>Disc Number</key><integer>1</integer>
            <key>Disc Count</key><integer>1</integer>
            <key>Track Number</key><integer>14</integer>
            <key>Track Count</key><integer>15</integer>
            <key>Year</key><integer>2007</integer>
            <key>Date Modified</key><date>2011-06-07T13:22:48Z</date>
            <key>Date Added</key><date>2008-10-12T11:50:56Z</date>
            <key>Bit Rate</key><integer>123</integer>
            <key>Sample Rate</key><integer>44100</integer>
            <key>Play Count</key><integer>3</integer>
            <key>Play Date</key><integer>3367816684</integer>
            <key>Play Date UTC</key><date>2010-09-20T06:38:04Z</date>
            <key>Compilation</key><true/>
            <key>Artwork Count</key><integer>1</integer>
            <key>Sort Album</key><string>Bella Napoli</string>
            <key>Sort Artist</key><string>A.M.P</string>
            <key>Sort Composer</key><string>Barberis A., Galvieri</string>
            <key>Sort Name</key><string>Munastero 'e Santa Chiara</string>
            <key>Persistent ID</key><string>0000000000000376</string>
            <key>Track Type</key><string>File</string>
            <key>Location</key><string>file://localhost/C:/Users/andrea/Music/iTunes/iTunes%20Media/Music/Compilations/Bella%20Napoli/14%20Munastero%20'e%20Santa%20Chiara.m4a</string>
            <key>File Folder Count</key><integer>-1</integer>
            <key>Library Folder Count</key><integer>-1</integer>
        </dict>
        <key>2653</key>
        <dict>
            <key>Track ID</key><integer>2653</integer>
            <key>Name</key><string>Traccia 01</string>
            <key>Artist</key><string>A6 ALLROAD</string>
            <key>Album Artist</key><string>A6 ALLROAD</string>
            <key>Album</key><string>2008 TUTTI SUCCESSI</string>
            <key>Kind</key><string>File audio MPEG</string>
            <key>Size</key><integer>5888463</integer>
            <key>Total Time</key><integer>245263</integer>
            <key>Track Number</key><integer>1</integer>
            <key>Track Count</key><integer>20</integer>
            <key>Date Modified</key><date>2008-01-18T08:12:30Z</date>
            <key>Date Added</key><date>2008-01-18T08:36:02Z</date>
            <key>Bit Rate</key><integer>192</integer>
            <key>Sample Rate</key><integer>44100</integer>
            <key>Play Count</key><integer>28</integer>
            <key>Play Date</key><integer>3419616065</integer>
            <key>Play Date UTC</key><date>2012-05-11T19:21:05Z</date>
            <key>Skip Date</key><date>2012-02-01T03:48:19Z</date>
            <key>Sort Album</key><string>2008 TUTTI SUCCESSI</string>
            <key>Sort Album Artist</key><string>A6 ALLROAD</string>
            <key>Sort Artist</key><string>A6 ALLROAD</string>
            <key>Sort Name</key><string>Traccia 01</string>
            <key>Persistent ID</key><string>0000000000000377</string>
            <key>Track Type</key><string>File</string>
            <key>Location</key><string>file://localhost/C:/Users/andrea/Music/iTunes/iTunes%20Media/Music/A6%20ALLROAD/2008%20TUTTI%20SUCCESSI/01%20Traccia%2001.mp3</string>
            <key>File Folder Count</key><integer>5</integer>
            <key>Library Folder Count</key><integer>1</integer>
        </dict>
        <key>2655</key>
        <dict>
            <key>Track ID</key><integer>2655</integer>
            <key>Name</key><string>Traccia 02</string>
            <key>Artist</key><string>A6 ALLROAD</string>
            <key>Album</key><string>2008 TUTTI SUCCESSI</string>
            <key>Kind</key><string>File audio MPEG</string>
            <key>Size</key><integer>4675349</integer>
            <key>Total Time</key><integer>194716</integer>
            <key>Track Number</key><integer>2</integer>
            <key>Track Count</key><integer>20</integer>
            <key>Date Modified</key><date>2008-01-18T08:12:30Z</date>
            <key>Date Added</key><date>2008-01-18T08:36:44Z</date>
            <key>Bit Rate</key><integer>192</integer>
            <key>Sample Rate</key><integer>44100</integer>
            <key>Play Count</key><integer>25</integer>
            <key>Play Date</key><integer>3419616259</integer>
            <key>Play Date UTC</key><date>2012-05-11T19:24:19Z</date>
            <key>Skip Date</key><date>2012-07-15T11:12:37Z</date>
            <key>Sort Album</key><string>2008 TUTTI SUCCESSI</string>
            <key>Sort Artist</key><string>A6 ALLROAD</string>
            <key>Sort Name</key><string>Traccia 02</string>
            <key>Persistent ID</key><string>0000000000000378</string>
            <key>Track Type</key><string>File</string>
            <key>Location</key><string>file://localhost/C:/Users/andrea/Music/iTunes/iTunes%20Media/Music/A6%20ALLROAD/2008%20TUTTI%20SUCCESSI/02%20Traccia%2002.mp3</string>
            <key>File Folder Count</key><integer>5</integer>
            <key>Library Folder Count</key><integer>1</integer>
        </dict>

这不是完整的文件,但你明白了。 我正在尝试获取相关信息以传递到属性并创建此对象,但我不知道从哪里开始:

package entities;

public class Track {

private int id;
private String name;
private String artist;
private String composer;
private String album;
private String genre;
private String kind;
private int size;
private int totalTime;
private int discNumber;
private int discCount;
private int trackNumber;
private int trackCount;
private int year;
private int dateModified;
private int dateAdded;
private int bitRate;
private int playCount;
private int playDate;
private int playDateUTC;
private boolean compilation;
private int artworkCount;
private String sortAlbum;
private String sortArtist;
private String sortComposer;
private String persistantID;
private String trackType;
private String location;
private int fileFolderCount;
private int libraryFolderCount;
public Track(int id, String name, String artist, String composer, String album, String genre, String kind, int size,
        int totalTime, int discNumber, int discCount, int trackNumber, int trackCount, int year, int dateModified,
        int dateAdded, int bitRate, int playCount, int playDate, int playDateUTC, boolean compilation,
        int artworkCount, String sortAlbum, String sortArtist, String sortComposer, String persistantID,
        String trackType, String location, int fileFolderCount, int libraryFolderCount) {
    super();
    this.id = id;
    this.name = name;
    this.artist = artist;
    this.composer = composer;
    this.album = album;
    this.genre = genre;
    this.kind = kind;
    this.size = size;
    this.totalTime = totalTime;
    this.discNumber = discNumber;
    this.discCount = discCount;
    this.trackNumber = trackNumber;
    this.trackCount = trackCount;
    this.year = year;
    this.dateModified = dateModified;
    this.dateAdded = dateAdded;
    this.bitRate = bitRate;
    this.playCount = playCount;
    this.playDate = playDate;
    this.playDateUTC = playDateUTC;
    this.compilation = compilation;
    this.artworkCount = artworkCount;
    this.sortAlbum = sortAlbum;
    this.sortArtist = sortArtist;
    this.sortComposer = sortComposer;
    this.persistantID = persistantID;
    this.trackType = trackType;
    this.location = location;
    this.fileFolderCount = fileFolderCount;
    this.libraryFolderCount = libraryFolderCount;
}
public Track() {
    super();
    // TODO Auto-generated constructor stub
}
public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getArtist() {
    return artist;
}
public void setArtist(String artist) {
    this.artist = artist;
}
public String getComposer() {
    return composer;
}
public void setComposer(String composer) {
    this.composer = composer;
}
public String getAlbum() {
    return album;
}
public void setAlbum(String album) {
    this.album = album;
}
public String getGenre() {
    return genre;
}
public void setGenre(String genre) {
    this.genre = genre;
}
public String getKind() {
    return kind;
}
public void setKind(String kind) {
    this.kind = kind;
}
public int getSize() {
    return size;
}
public void setSize(int size) {
    this.size = size;
}
public int getTotalTime() {
    return totalTime;
}
public void setTotalTime(int totalTime) {
    this.totalTime = totalTime;
}
public int getDiscNumber() {
    return discNumber;
}
public void setDiscNumber(int discNumber) {
    this.discNumber = discNumber;
}
public int getDiscCount() {
    return discCount;
}
public void setDiscCount(int discCount) {
    this.discCount = discCount;
}
public int getTrackNumber() {
    return trackNumber;
}
public void setTrackNumber(int trackNumber) {
    this.trackNumber = trackNumber;
}
public int getTrackCount() {
    return trackCount;
}
public void setTrackCount(int trackCount) {
    this.trackCount = trackCount;
}
public int getYear() {
    return year;
}
public void setYear(int year) {
    this.year = year;
}
public int getDateModified() {
    return dateModified;
}
public void setDateModified(int dateModified) {
    this.dateModified = dateModified;
}
public int getDateAdded() {
    return dateAdded;
}
public void setDateAdded(int dateAdded) {
    this.dateAdded = dateAdded;
}
public int getBitRate() {
    return bitRate;
}
public void setBitRate(int bitRate) {
    this.bitRate = bitRate;
}
public int getPlayCount() {
    return playCount;
}
public void setPlayCount(int playCount) {
    this.playCount = playCount;
}
public int getPlayDate() {
    return playDate;
}
public void setPlayDate(int playDate) {
    this.playDate = playDate;
}
public int getPlayDateUTC() {
    return playDateUTC;
}
public void setPlayDateUTC(int playDateUTC) {
    this.playDateUTC = playDateUTC;
}
public boolean isCompilation() {
    return compilation;
}
public void setCompilation(boolean compilation) {
    this.compilation = compilation;
}
public int getArtworkCount() {
    return artworkCount;
}
public void setArtworkCount(int artworkCount) {
    this.artworkCount = artworkCount;
}
public String getSortAlbum() {
    return sortAlbum;
}
public void setSortAlbum(String sortAlbum) {
    this.sortAlbum = sortAlbum;
}
public String getSortArtist() {
    return sortArtist;
}
public void setSortArtist(String sortArtist) {
    this.sortArtist = sortArtist;
}
public String getSortComposer() {
    return sortComposer;
}
public void setSortComposer(String sortComposer) {
    this.sortComposer = sortComposer;
}
public String getPersistantID() {
    return persistantID;
}
public void setPersistantID(String persistantID) {
    this.persistantID = persistantID;
}
public String getTrackType() {
    return trackType;
}
public void setTrackType(String trackType) {
    this.trackType = trackType;
}
public String getLocation() {
    return location;
}
public void setLocation(String location) {
    this.location = location;
}
public int getFileFolderCount() {
    return fileFolderCount;
}
public void setFileFolderCount(int fileFolderCount) {
    this.fileFolderCount = fileFolderCount;
}
public int getLibraryFolderCount() {
    return libraryFolderCount;
}
public void setLibraryFolderCount(int libraryFolderCount) {
    this.libraryFolderCount = libraryFolderCount;
}
@Override
public String toString() {
    return "Track [id=" + id + ", name=" + name + ", artist=" + artist + ", composer=" + composer + ", album="
            + album + ", genre=" + genre + ", kind=" + kind + ", size=" + size + ", totalTime=" + totalTime
            + ", discNumber=" + discNumber + ", discCount=" + discCount + ", trackNumber=" + trackNumber
            + ", trackCount=" + trackCount + ", year=" + year + ", dateModified=" + dateModified + ", dateAdded="
            + dateAdded + ", bitRate=" + bitRate + ", playCount=" + playCount + ", playDate=" + playDate
            + ", playDateUTC=" + playDateUTC + ", compilation=" + compilation + ", artworkCount=" + artworkCount
            + ", sortAlbum=" + sortAlbum + ", sortArtist=" + sortArtist + ", sortComposer=" + sortComposer
            + ", persistantID=" + persistantID + ", trackType=" + trackType + ", location=" + location
            + ", fileFolderCount=" + fileFolderCount + ", libraryFolderCount=" + libraryFolderCount + "]";
}





}

这是我到目前为止所拥有的:

package main;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import entities.Track;

public class Main {

Main() throws ParserConfigurationException, SAXException, IOException{
    ArrayList<Track> tracks = new ArrayList<Track>(); 
    File xmlFile = new File("iTunes Music Library1.xml");

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    DocumentBuilder dBuilder = factory.newDocumentBuilder();
    Document doc = dBuilder.parse(xmlFile);
    System.out.println("Root element " +doc.getDocumentElement().getNodeName());

    NodeList nList = doc.getElementsByTagName("dict");

    for(int i=0;i<nList.getLength();i++) {
        Node node = nList.item(i);
        NodeList childList=node.getChildNodes();
        System.out.println("Current Element: "+node.getNodeName());

        }

    }

}

public static void main(String[] args) {
    try {
        new Main();
    } catch (ParserConfigurationException | SAXException | IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

谢谢。

最佳答案

我会使用 SAX 解析器。您的实现类将被调用以获取 XML 文件中每个对象的开始/结束,并且您将必须编写一些能够理解文件结构的智能内容。也就是说,记住最后一个键,以便您知道何时获得值以及该值的用途。

如果您从未使用 SAX 解析器编写过代码,这将花费您一些时间,但您会学到很多东西。

关于java - java中的XML解析: how to get info out of a tag adjacent to a tag with a certain value?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59073903/

相关文章:

java - 使用 JAXB 从未编码的 java 对象获取 xml 元素名称

java - Google V8 的工作方式与 Java 虚拟机类似吗?

java - "<T extends SuperClass>"的正确用法

java - dom4j XPath 无法解析 xhtml 文档

java - 使用 DOM4J 更改 XML 属性的最佳方法是什么

python - 解析sql select语句以获取python中的where子句条件

parsing - golang 使用解析标准库从电子邮件中获取域

java - 日期时间解析 - 无法取回原始值

java - 您可以放入 Eclipse java 文档中的代码行数是否有限制

java - 如何使用外部参数更改数组中元素的值?