问题
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