DOM - Accessing inner elements of the same name in java

心已入冬 提交于 2019-12-25 07:39:48

问题


I have an xml file that has many <dict> elements and I want to try get the elements in the third element. My problem is that when I'm calling doc.getElementsByTagName("dict") It gets every element that is called dict.

Here is the code:

try {
        File inputFile = new File("itunes2.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory
                .newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(inputFile);
        doc.getDocumentElement().normalize();
        System.out.println("Root element :"
                + doc.getDocumentElement().getNodeName());
        NodeList nList = doc.getElementsByTagName("dict");
        System.out.println("----------------------------");
        for (int temp = 0; temp < nList.getLength(); temp++) {
            Node nNode = nList.item(temp);
            System.out.println("\nCurrent Element :" + nNode.getNodeName());
            if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                Element eElement = (Element) nNode;
                System.out.println("Major Version : "
                        + eElement.getElementsByTagName("integer").item(0)
                                .getTextContent());
                System.out.println("Minor Version : "
                        + eElement.getElementsByTagName("integer").item(0)
                                .getTextContent());
                System.out.println("Application version : "
                        + eElement.getElementsByTagName("string").item(0)
                                .getTextContent());
                System.out.println("Features : "
                        + eElement.getElementsByTagName("integer").item(2)
                                .getTextContent());
                System.out.println("Music Folder : "
                        + eElement.getElementsByTagName("string").item(1)
                                .getTextContent());
                System.out.println("Library Persistent ID : "
                        + eElement.getElementsByTagName("string").item(2)
                                .getTextContent());
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

XML:

<?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>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>

And it outputs this:

Root element :plist

Current Element :dict
Major Version : 1
Minor Version : 1
Application version : 10.1
Features : 5
Music Folder :  file://localhost//Thomts/Holly/data/My%20Music/iTunes/iTunes%20Music/
Library Persistent ID : 29E12A03204E0721

Current Element :dict
Major Version : 324
Minor Version : 324
Application version : Talk Dirty To Me
Features : 224866
Music Folder : Poison
Library Persistent ID : Poison

As you can see it gets the correct information for the first element and then the wrong info for the second element. I would like to know how to get all the information within a third dict tag so that I can get all information for a song e.g. Track ID, Name, Artist etc..


回答1:


you don't extract the good information, firstly because there is no link between them:

For example: Major Version1

you retrieve by: integer, not by key

You have to test first content of key, then take the next item (integer).

Otherwise, if you can choose format of xml file,

you should retrieve by key, and put 1 inside this tag, like that

< key name="Major Version">< integer> 1 < /integer >< /key>

or just < key name="Major Version">1< /key> if you dont care type information

or < Major_Version>1< /Major_Version> : you can retreive by

getElementsByTagName("Major_Version")

I rewrote your code :

You should also make a difference between dict for the album, and dict for a song (not the same keys are available).

NodeList nList = document.getElementsByTagName("dict");
System.out.println("----------------------------");
for (int temp = 0; temp < nList.getLength(); temp++) 
    {
    Node nNode = nList.item(temp);

    if (nNode.getNodeType() == Node.ELEMENT_NODE)
        {
        Element eElement = (Element) nNode;

        System.out.println("NODE NAME:"+eElement.getNodeName());
        System.out.println("TAG NAME:"+eElement.getTagName());

        // Iterate through sub-elements

        // A map to store key => values
        Map<String,String> mss=new HashMap<String,String>();

        NodeList childs = eElement.getChildNodes();
        {
             for (int k = 0; k < childs.getLength(); k++) 
            {
             Node child = childs.item(k);

             if (child.getNodeType() == Node.ELEMENT_NODE)
                {
                 Element child_element = (Element) child;
                 String tag=child_element.getTagName();
                 String content=child_element.getTextContent();

                 if (tag.equals("key") && (k+1< childs.getLength()))
                 {
                // Next one
                    Node next = childs.item(k+1);

                    if (next.getNodeType() == Node.ELEMENT_NODE)
                    {
                     Element next_element = (Element) next;
                     // Should be integer or string
                     String next_tag=next_element.getTagName();
                     String next_content=next_element.getTextContent();

                     // store
                     mss.put(content, next_content);
                     // skip
                     k++;
                    }
                 }
                }
            }
        }

        // SEE THE MAP
        System.out.println("ALL ELEMENTS:"+mss);

        // Get what you want
        String major_version="";
        String minor_version="";
        String application_version="";
        String music_folder="";
        String track_id="";
        String name="";
        String artist="";

        if (mss.containsKey("Major Version")) major_version=mss.get("Major Version");
        if (mss.containsKey("Minor Version")) minor_version=mss.get("Minor Version");
        if (mss.containsKey("Application Version")) application_version=mss.get("Application Version");
        if (mss.containsKey("Music Folder")) music_folder=mss.get("Music Folder");
        if (mss.containsKey("Track ID")) track_id=mss.get("Track ID");
        if (mss.containsKey("Name")) name=mss.get("Name");
        if (mss.containsKey("Artist")) artist=mss.get("Artist");

        // SHOW
        System.out.println("Major  Version : "+major_version);
        System.out.println("Minor Version : "+minor_version);
        System.out.println("Application version : "+application_version);
        System.out.println("Music Folder : "+music_folder);          

        System.out.println("Track ID : "+track_id);   
        System.out.println("Name : "+name);   
        System.out.println("Artist : "+artist); 
        }
    }

I hope it helps you



来源:https://stackoverflow.com/questions/34106517/dom-accessing-inner-elements-of-the-same-name-in-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!