简体   繁体   English

DOM-在Java中访问相同名称的内部元素

[英]DOM - Accessing inner elements of the same name in java

I have an xml file that has many <dict> elements and I want to try get the elements in the third element. 我有一个包含许多<dict>元素的xml文件,我想尝试获取第三个元素中的元素。 My problem is that when I'm calling doc.getElementsByTagName("dict") It gets every element that is called dict. 我的问题是,当我调用doc.getElementsByTagName(“ dict”)时,它将获取称为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:

<?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 eg Track ID, Name, Artist etc.. 我想知道如何在第三个dict标签中获取所有信息,以便获取歌曲的所有信息,例如曲目ID,名称,艺术家等。

you don't extract the good information, firstly because there is no link between them: 您不会提取好的信息,首先是因为它们之间没有链接:

For example: Major Version1 例如:主要版本1

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, 否则,如果您可以选择xml文件的格式,

you should retrieve by key, and put 1 inside this tag, like that 您应该按键检索,然后在该标签中放入1,就像这样

< key name="Major Version">< integer> 1 < /integer >< /key> <键名=“主要版本”> <整数> 1 </整数> </键>

or just < key name="Major Version">1< /key> if you dont care type information 或仅<键名=“主要版本”> 1 </键>(如果您不在乎类型信息)

or < Major_Version>1< /Major_Version> : you can retreive by 或<MajorVersion> 1 </ Major_Version>:您可以通过

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). 您还应该在专辑的dict和歌曲的dict之间进行区分(没有相同的键)。

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 希望对您有帮助

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在Java中使用jsoup在所有div类名称和span类名称相同时如何查找内部元素 - how to find the inner elements when all div class name and span class name are same using jsoup in java 如何在Java中使用DOM在XML文档中的相同层次结构级别上添加两个或多个相同名称的元素 - How to add two or more elements of the same name at the same hierarchical level in an XML document using DOM in Java 访问 java 中的内部 class - Accessing to inner class in java 是否允许在XSD中使用相同的内部和上部元素名称? - Is it allowed to have the same name of inner and upper elements in XSD? 在Java中使用相同的内部类名和对象名 - Using an inner class name and an object name same in Java Java中的W3C DOM API,按名称获取子元素 - W3C DOM API in Java, get child elements by name 对象实例化:具有相同名称的内部类和外部类(Java) - Object instantiation: Inner class and outer class with the same name (Java) Java 内class 与其他顶级class同名 - Java inner class with the same name as other top level class Java XML-具有相同名称的嵌套元素 - Java XML - nested elements with same name Java:使用该ArrayList中的其余元素时访问相同的ArrayList - Java: Accessing same ArrayList while using the rest of the elements in that ArrayList
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM