簡體   English   中英

使用多個xpath表達式從xml文件中選擇所有元素

[英]Select all elements from xml file using multiple xpath expressions

我有一個大的xml文件,我想解析並存儲為對象。 目前,我只是試圖解析所有信息,然后將其存儲在對象中。 到目前為止,我只能解析xml文件中的字符串,但是我也希望能夠解析整數,並且我不確定如何在同一循環中執行此操作,因為我會將它們存儲為對象。

下面是我的代碼:

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();
    System.out.println(root.getNodeName());
    System.out.println("============================");

    XPath xPath = XPathFactory.newInstance().newXPath();
    NodeList nList = (NodeList) xPath.evaluate("/plist/dict/dict/dict/key[text()='Name']/following::string[1]", root, XPathConstants.NODESET);
    for (int i = 0; i < nList.getLength(); ++i) {
        Element e = (Element) nList.item(i);
        String value = e.getFirstChild().getNodeValue();
        System.out.println("Name: " + value);
    }

和我的xml文件:

<plist version="1.0">
<dict>
<key>Major Version</key><integer>1</integer>
<key>Minor Version</key><integer>1</integer>
<key>Application Version</key><string>10.1</string>
<key>Features</key><integer>5</integer>
<key>Show Content Ratings</key><true/>
<key>Music Folder</key><string>file://localhost//Thomts/Holly/data/My%20Music/iTunes/iTunes%20Music/</string>
<key>Library Persistent ID</key><string>29E12A03204E0721</string>
<key>Tracks</key>
<dict>
    <key>324</key>
    <dict>
        <key>Track ID</key><integer>324</integer>
        <key>Name</key><string>Talk Dirty To Me</string>
        <key>Artist</key><string>Poison</string>
        <key>Composer</key><string>Poison</string>
        <key>Album</key><string>The Best Of Poison: 20 Years Of Rock</string>
        <key>Genre</key><string>Metal</string>
        <key>Kind</key><string>AAC audio file</string>
        <key>Size</key><integer>3698203</integer>
        <key>Total Time</key><integer>224866</integer>
        <key>Disc Number</key><integer>1</integer>
        <key>Disc Count</key><integer>1</integer>
        <key>Track Number</key><integer>1</integer>
        <key>Track Count</key><integer>18</integer>
        <key>Year</key><integer>1986</integer>
        <key>Date Modified</key><date>2008-08-07T15:16:57Z</date>
        <key>Date Added</key><date>2008-08-07T15:17:17Z</date>
        <key>Bit Rate</key><integer>128</integer>
        <key>Sample Rate</key><integer>44100</integer>
        <key>Play Count</key><integer>6</integer>
        <key>Play Date</key><integer>3378486192</integer>
        <key>Play Date UTC</key><date>2011-01-22T03:23:12Z</date>
        <key>Compilation</key><true/>
        <key>Sort Album</key><string>Best Of Poison: 20 Years Of Rock</string>
        <key>Persistent ID</key><string>29E12A03204E0873</string>
        <key>Track Type</key><string>File</string>
        <key>Location</key><string>file://localhost//Thomts/Holly/data/My%20Music/iTunes/iTunes%20Music/Compilations/The%20Best%20Of%20Poison_%2020%20Years%20Of%20Rock/01%20Talk%20Dirty%20To%20Me.m4a</string>
        <key>File Folder Count</key><integer>4</integer>
        <key>Library Folder Count</key><integer>1</integer>
    </dict>
    <key>326</key>
    <dict>
        <key>Track ID</key><integer>326</integer>
        <key>Name</key><string>I Want Action [Single Version]</string>
        <key>Artist</key><string>Poison</string>
        <key>Composer</key><string>Poison</string>
        <key>Album</key><string>The Best Of Poison: 20 Years Of Rock</string>
        <key>Genre</key><string>Metal</string>
        <key>Kind</key><string>AAC audio file</string>
        <key>Size</key><integer>3070259</integer>
        <key>Total Time</key><integer>185893</integer>
        <key>Disc Number</key><integer>1</integer>
        <key>Disc Count</key><integer>1</integer>
        <key>Track Number</key><integer>2</integer>
        <key>Track Count</key><integer>18</integer>
        <key>Year</key><integer>1986</integer>
        <key>Date Modified</key><date>2008-08-07T15:17:12Z</date>
        <key>Date Added</key><date>2008-08-07T15:17:32Z</date>
        <key>Bit Rate</key><integer>128</integer>
        <key>Sample Rate</key><integer>44100</integer>
        <key>Play Count</key><integer>3</integer>
        <key>Play Date</key><integer>3367665479</integer>
        <key>Play Date UTC</key><date>2010-09-18T21:37:59Z</date>
        <key>Compilation</key><true/>
        <key>Sort Album</key><string>Best Of Poison: 20 Years Of Rock</string>
        <key>Persistent ID</key><string>29E12A03204E087A</string>
        <key>Track Type</key><string>File</string>
        <key>Location</key><string>file://localhost//Thomts/Holly/data/My%20Music/iTunes/iTunes%20Music/Compilations/The%20Best%20Of%20Poison_%2020%20Years%20Of%20Rock/02%20I%20Want%20Action%20%5BSingle%20Version%5D.m4a</string>
        <key>File Folder Count</key><integer>4</integer>
        <key>Library Folder Count</key><integer>1</integer>
    </dict>
 </dict>
</dict>

我的Song.java:

public class Song {

private int id, size, totalTime, discnumber, disccount, trackNumber, trackCount, year;
private String name, artist, composer, album, genre, kind;
public Song(int id, int size, int totalTime, int discnumber, int disccount,
        int trackNumber, int trackCount, int year, String name,
        String artist, String composer, String album, String genre,
        String kind) {
    super();
    this.id = id;
    this.size = size;
    this.totalTime = totalTime;
    this.discnumber = discnumber;
    this.disccount = disccount;
    this.trackNumber = trackNumber;
    this.trackCount = trackCount;
    this.year = year;
    this.name = name;
    this.artist = artist;
    this.composer = composer;
    this.album = album;
    this.genre = genre;
    this.kind = kind;
}        

我目前正在使用的表達式(/ plist / dict / dict / dict / key [text()='Name'] / following :: string [1])有效,但是我還想對整數使用另一個表達式,然后將它們全部存儲在同一循環中的對象中。 我已經嘗試過但是還沒有成功。 有人可以幫我嗎?

這個想法是選擇包含您需要填充每個Song對象的所有信息的元素,即最里面的<dict>元素。 遍歷<dict> ,並在每次迭代中使用相對的XPath表達式來獲取詳細信息,例如:

.....
.....
NodeList nList = (NodeList)xPath.evaluate("/plist/dict/dict/dict", root, XPathConstants.NODESET);
for (int i = 0; i < nList.getLength(); ++i) {
    Element dict = (Element)nList.item(i);

    //get current TRACK ID and print
    Double trackId = (Double)xPath.evaluate("key[.='Track ID']/following-sibling::integer[1]", dict, XPathConstants.NUMBER);
    System.out.println("Track ID: " + trackId.toString());

    //get current NAME and print
    String name = (String)xPath.evaluate("key[.='Name']/following-sibling::string[1]", dict, XPathConstants.STRING);
    System.out.println("Name: " + name);

    //get further information and process as needed
    .....
    .....
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM