3

我想要以下 XML 中的两个哈希表。第一个是 (screen id,widget id),第二个是 (widget id,string id)。

我已经能够使用 DOM 解析这个 XML,但是我还没有将它的内容放入哈希表中。

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

我试过的代码是

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]");

    }

    }

  }
}
4

1 回答 1

0

通过查看您的代码,我假设您能够打印出整个文档,但不能找到您要查找的数据。我用XMLBeam做类似的事情。它使您可以创建所需数据的面向对象的表示,而无需遵循您正在处理的 xml 的完整结构。以下是如何在您的第一个 xml 文件中提取数据,第二个同样简单(并且比手动遍历 DOM 短得多):

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);
            }
        }
    }
}

}

这打印出来

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

现在您应该可以填写您的 HashTable。(请考虑 HashMap 或 ConcurrentHashMap)

于 2014-12-16T07:18:54.453 回答