简体   繁体   中英

how to parse this XML using DOM and put its content in a hashtable?

I want two hash tables out of the following XML. The first one being (screen id,widget id) and the second one being (widget id,string id).

I have been able to parse this XML using DOM but putting its content into a hash table is what I haven't done.

<?xml version="1.0" encoding="UTF-8"?>

<screen id="616699" name ="SCR_NEW_HOME">

        <widget id="617259" type="label" name= "NEW_HOME_TITLE">
        <attribute type = "Strings">

            <val id="54">HOME_SYSSETUP</val>
        </attribute>
        </widget>
        <widget id="616836" type = "label" name ="HOME_MENU">
        <attribute type="Strings">

                <val id="1815" >DAILY</val>
                <val id="2060" >MONTH_NOV</val>
                <val id="1221" >ASPECT_RATIO_PANSCAN</val>
        </attribute>
        </widget>

<screen id="1556" name="SCR_EVENTLIST">

        <widget id="77009" type= "label" name="EL_GUIDE_EVENT_TABLE">
        <attribute type ="Strings">

                <val id="1">time</val>
                <val id="2">date</val>
        </attribute>
        </widget>
        <widget id="186461" type= "label" name= "EL_PIG_CONT">
        <attribute type ="Strings">

                <val id="3">progress bar</val>
                <val id="4">video</val>
        </attribute>
    </widget>

and the code I have tried is

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

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

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

public class ReadXmlFile {
    private static Hashtable<Integer,ArrayList<Integer>> D1 = new Hashtable<Integer, ArrayList<Integer>>();
    private static Hashtable<Integer,ArrayList<Integer>> D2 = new Hashtable<Integer,ArrayList<Integer>>();
     static Integer ScreenID;
     static ArrayList<Integer> StringID;
     static ArrayList<Integer> WidgetID;
     static Integer WidgetID2;
  public static void main(String argv[]) {

   // try {

    File fXmlFile = new File("E:/eclipse workspace/stringValidation/screens.xml");
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = null;
    try {
        dBuilder = dbFactory.newDocumentBuilder();
    } catch (ParserConfigurationException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    Document doc = null;
    try {
        doc = dBuilder.parse(fXmlFile);
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    doc.getDocumentElement().normalize();


    System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
    if(doc.hasChildNodes()){

        printNote(doc.getChildNodes());

    }


    }
private static void printNote(NodeList nodeList) {


        for (int count = 0; count < nodeList.getLength(); count++) {

        Node tempNode = nodeList.item(count);


        // make sure it's element node.
        if (tempNode.getNodeType() == Node.ELEMENT_NODE) {

            // get node name and value
            System.out.println("\nNode Name =" + tempNode.getNodeName() + " [OPEN]");
            System.out.println("Node Value =" + tempNode.getTextContent());

            if (tempNode.hasAttributes()) {

                // get attributes names and values
                NamedNodeMap nodeMap = tempNode.getAttributes();

                for (int i = 0; i < nodeMap.getLength(); i++) {

                    Node node = nodeMap.item(i);
                    System.out.println("attr name : " + node.getNodeName());
                    System.out.println("attr value : " + node.getNodeValue());


            }

        }

        if (tempNode.hasChildNodes()) {

            // loop again if has child nodes
            printNote(tempNode.getChildNodes());

        }

        System.out.println("Node Name =" + tempNode.getNodeName() + " [CLOSE]");

    }

    }

  }
}

By looking at your code I assume that you are able to print out the whole document, but not to locate the data you are looking for. I do things like that with XMLBeam . It lets you create an object oriented representation of the data you need, without having to follow the complete structure of the xml you are processing. Here is how to extract the data in your first xml file, the second is just as easy (and much shorter than walking through the DOM by hand):

public class TestFirst {

@XBDocURL("res://first.xml")
public interface Projection {               
    @XBRead("//screen")
    List<Screen> getScreens();
}

public interface Widget {
    @XBRead("./@id")
    String getID();

    @XBRead("./attribute[@type='Strings']/val")
    List<String> getStringAttributes();
}

public interface Screen {                                   
    @XBRead("./@id")
    String getID();

    @XBRead("./widget")
    List<Widget> getWidgets();
}


@Test
public void testFirst() throws IOException {
    Projection projection = new XBProjector().io().fromURLAnnotation(Projection.class);
    for (Screen screen:projection.getScreens()) {
        for (Widget widget:screen.getWidgets()) {
            for (String string:widget.getStringAttributes()) {
                System.out.println(screen.getID()+" "+ widget.getID()+ " "+ string);
            }
        }
    }
}

}

This prints out

616699 617259 HOME_SYSSETUP
616699 616836 DAILY
616699 616836 MONTH_NOV
616699 616836 ASPECT_RATIO_PANSCAN

Now you should be able to fill your HashTable. (Plz consider HashMap or ConcurrentHashMap)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM