2016-03-21 5 views
-1

Ich bin neu in Java und XML und ich muss einige Daten aus einer XML-Datei abrufen.Parsing XML mit Java Dom Parser

Hier mein xml

ist
<?xml version="1.0" encoding="UTF-8"?> 
<course name="BSc (Hons) Software Engineering" version="5.0" type="FT" lowerbound="2012" upperbound="2014" > 
    <year id="1"> 
     <semester id="1"> 
     <module> 
      <code>HCA1105C</code> 
      <name>Computer Architecture</name> 
      <credits>4</credits> 
      <hrs_per_wk>2+2</hrs_per_wk> 
     </module> 
     <module> 
      <code>PROG1115C</code> 
      <name>Object Oriented Software Development I</name> 
      <credits>4</credits> 
      <hrs_per_wk>2+2</hrs_per_wk> 
     </module> 
     <module> 
      <code>MATH1103C</code> 
      <name>Decision Mathematics</name> 
      <credits>3</credits> 
      <hrs_per_wk>2+1</hrs_per_wk> 
     </module> 
     <module> 
      <code>ITE1107C</code> 
      <name>Language and Communication Seminar</name> 
      <credits>3</credits> 
      <hrs_per_wk>2+1</hrs_per_wk> 
     </module> 
     <module> 
      <code>MGMT1101C</code> 
      <name>Management Seminar</name> 
      <credits>3</credits> 
      <hrs_per_wk>2+1</hrs_per_wk> 
     </module> 
     </semester> 
     <semester id="2"> 
     <module> 
      <code>PROG1116C</code> 
      <name>Object Oriented Software Development II</name> 
      <credits>4</credits> 
      <hrs_per_wk>2+2</hrs_per_wk> 
     </module> 
     <module> 
      <code>WAT1116C</code> 
      <name>Internet Programming I</name> 
      <credits>4</credits> 
      <hrs_per_wk>2+2</hrs_per_wk> 
     </module> 
     <module> 
      <code>MATH1101C</code> 
      <name>Analytic Methods for Computing</name> 
      <credits>4</credits> 
      <hrs_per_wk>2+2</hrs_per_wk> 
     </module> 
     <module> 
      <code>DBT1111C</code> 
      <name>Database Design</name> 
      <credits>4</credits> 
      <hrs_per_wk>2+2</hrs_per_wk> 
     </module> 
     </semester> 
    </year> 
    <year id="2"> 
     <semester id="1"> 
     <module> 
      <code>CAN2112C</code> 
      <name>Network Design &amp; Programming</name> 
      <credits>4</credits> 
      <hrs_per_wk>2+2</hrs_per_wk> 
     </module> 
     <module> 
      <code>WAT2117C</code> 
      <name>Internet Programming II</name> 
      <credits>4</credits> 
      <hrs_per_wk>2+2</hrs_per_wk> 
     </module> 
     <module> 
      <code>OSS2109C</code> 
      <name>Operating Systems</name> 
      <credits>4</credits> 
      <hrs_per_wk>2+2</hrs_per_wk> 
     </module> 
     <module> 
      <code>PROG2117C</code> 
      <name>Desktop Application Development</name> 
      <credits>4</credits> 
      <hrs_per_wk>2+2</hrs_per_wk> 
     </module> 
     </semester> 
     <semester id="2"> 
     <module> 
      <code>SDT2114C</code> 
      <name>Requirements Engineering</name> 
      <credits>4</credits> 
      <hrs_per_wk>2+2</hrs_per_wk> 
     </module> 
     <module> 
      <code>MATH2323C</code> 
      <name>Numerical Methods</name> 
      <credits>4</credits> 
      <hrs_per_wk>2+2</hrs_per_wk> 
     </module> 
     <module> 
      <code>MCT2104C</code> 
      <name>Mobile Application Development</name> 
      <credits>4</credits> 
      <hrs_per_wk>2+2</hrs_per_wk> 
     </module> 
     <module> 
      <code>MCT2104C</code> 
      <name>Mobile Application Development</name> 
      <credits>4</credits> 
      <hrs_per_wk>2+2</hrs_per_wk> 
     </module> 
     <module> 
      <code>WAT2124C</code> 
      <name>Web Services</name> 
      <credits>4</credits> 
      <hrs_per_wk>2+2</hrs_per_wk> 
     </module> 
     <module> 
      <code>MGMT2104C</code> 
      <name>Research &amp; Development Seminar</name> 
      <credits>3</credits> 
      <hrs_per_wk>2+1</hrs_per_wk> 
     </module> 
     </semester> 
    </year> 
    <year id="3"> 
     <semester id="1"> 
     <module> 
      <code>SECU3119C</code> 
      <name>Secure Software Development</name> 
      <credits>4</credits> 
      <hrs_per_wk>2+2</hrs_per_wk> 
     </module> 
     <module> 
      <code>MULT3114C</code> 
      <name>Game Development</name> 
      <credits>4</credits> 
      <hrs_per_wk>2+2</hrs_per_wk> 
     </module> 
     <module> 
      <code>SEM3112C</code> 
      <name>Project Management Seminar</name> 
      <credits>3</credits> 
      <hrs_per_wk>2+1</hrs_per_wk> 
     </module> 
     </semester> 
     <semester id="2"> 
     <module> 
      <code>SDT3104C</code> 
      <name>Enterprise Software Development</name> 
      <credits>4</credits> 
      <hrs_per_wk>2+2</hrs_per_wk> 
     </module> 
     <module> 
      <code>WAT3125C</code> 
      <name>Emerging Web Technologies</name> 
      <credits>4</credits> 
      <hrs_per_wk>2+2</hrs_per_wk> 
     </module> 
     <module> 
      <code>SEM3113C</code> 
      <name>Software Quality Management</name> 
      <credits>4</credits> 
      <hrs_per_wk>2+2</hrs_per_wk> 
     </module> 
     <module> 
      <code>MGMT3105C</code> 
      <name>Entrepreneurship Seminar</name> 
      <credits>3</credits> 
      <hrs_per_wk>2+1</hrs_per_wk> 
     </module> 
     <module> 
      <code>PROJ3105C</code> 
      <name>Systems Development Project</name> 
      <credits>9</credits> 
      <hrs_per_wk /> 
     </module> 
     </semester> 
    </year> 
</course> 

Lassen Sie uns sagen, dass ich alle Module Code erhalten möchten, die 1 Jahr im Semester 1.

HCA1105C 
PROG1115C 
MATH1103C 
ITE1107C 
MGMT1101C 

Hier ist mein Code so weit

try { 
    File inputFile = new File(System.getProperty("user.dir") + "/courses/bse.xml"); 
     DocumentBuilderFactory dbFactory 
       = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(inputFile); 
     doc.getDocumentElement().normalize(); 
     NodeList nList = doc.getElementsByTagName("year"); 
     for (int i = 0; i < nList.getLength(); i++) { 
      Node nNode = nList.item(i); 
      if (nNode.getNodeType() == Node.ELEMENT_NODE) { 
       Element eElement = (Element) nNode; 
       //if (Integer.parseInt(eElement.getAttribute("id")) == 1) { 
        System.out.println(eElement.getElementsByTagName("code").item(0).getTextContent()); 
       //} 
      } 
     } 
    } catch (Exception e) { 
     JOptionPane.showMessageDialog(null, e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); 
     System.exit(1); 
    } 

Ich bekomme folgende Ausgabe

HCA1105C 
CAN2112C 
SECU3119C 

Antwort

1

Überprüfung untergeordnete Knoten und tauchen Sie ein in für die Module wird Ihr erwartetes Ergebnis wie unten geben;

public static void main(String[] args) { 
     try { 
      File inputFile = new File("Snippet.xml"); 
      DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
      Document doc = dBuilder.parse(inputFile); 
      doc.getDocumentElement().normalize(); 
      NodeList nList = doc.getElementsByTagName("year"); 
      for (int i = 0; i < nList.getLength(); i++) { 
       Node nNode = nList.item(i); 
       if (nNode.getNodeType() == Node.ELEMENT_NODE) { 
        Element eElement = (Element) nNode; 
        if (Integer.parseInt(eElement.getAttribute("id")) == 1) { // Found year 1 
         NodeList semeterList = nNode.getChildNodes(); 
         for (int j = 0; j < semeterList.getLength(); j++) { 
          nNode = semeterList.item(j); 
          if (nNode.getNodeType() == Node.ELEMENT_NODE) { 
           Element semesterNode = (Element) nNode; 
           if (Integer.parseInt(semesterNode.getAttribute("id")) == 1) { //Found semester 1 
            NodeList moduleList = semesterNode.getChildNodes(); 
            for (int k = 0; k < moduleList.getLength(); k++) { 
             nNode = moduleList.item(k); 
             if (nNode.getNodeType() == Node.ELEMENT_NODE) { 
              Element modeluNode = (Element) nNode; 
              System.out.println(modeluNode.getElementsByTagName("code").item(0).getTextContent()); 
             } 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      JOptionPane.showMessageDialog(null, e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); 
      System.exit(1); 
     } 
    } 
+0

Vielen Dank Mate ....endlich verstehen Xml Parsing besser – user2650277

2

Ihr Code liest 1. Modul jedes Jahr. Dies liegt daran, dass die Knotenliste 3 Knoten (Jahr = 1, Jahr = 2, Jahr = 3) für die von Ihnen angegebenen Kriterien enthält.

Wenn Sie alle Module von Jahr 1 lesen möchten, müssen Sie in den Unterabschnitt des Dokuments mit year = "1" zurückkehren. Dann bekommst du eine Liste von Semestern. Sie müssen sich weiter auf Kinder des Semesters = 1 einschreiben.

Sie können versuchen, Abfrage mit Xpath, wo Sie die Module von Jahr = 1 und Semester = 1 direkt erhalten können.

http://viralpatel.net/blogs/java-xml-xpath-tutorial-parse-xml/

EDITED mit modifizierten Code XPath:

try { 
    File inputFile = new File("courses.xml"); 
     DocumentBuilderFactory dbFactory 
       = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(inputFile); 
     doc.getDocumentElement().normalize(); 

     XPath xPath = XPathFactory.newInstance().newXPath(); 
     String expression = "/course/year[@id=1]/semester[@id=1]/module/code"; 
     NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(doc, XPathConstants.NODESET); 
     System.out.println(expression); 
     for (int i = 0; i < nodeList.getLength(); i++) { 
      System.out.println(nodeList.item(i).getTextContent()); 
     } 
    } catch (Exception e) { 
     JOptionPane.showMessageDialog(null, e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); 
     System.exit(1); 
    } 
+0

Es scheint, XPath ist eine gute Alternative. +1 zu diesem Beitrag. –

+0

Eine kleine Änderung wäre, die Modulknoten zu holen und dann den Code von dort zu bekommen. Abhängig davon, ob Sie eine der zusätzlichen Informationen benötigen oder nicht. Aber das sollte die bevorzugte Antwort sein. – trappski

0

Wir alle Codes durch DOM abrufen kann, durch folgenden Code:

try { 
     File inputFile = new File("src/resources/res.xml"); 
     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(inputFile); 
     doc.getDocumentElement().normalize(); 
     NodeList nList = doc.getElementsByTagName("module"); 
     for (int i = 0; i < nList.getLength(); i++) { 
      Node nNode = nList.item(i); 
      if (nNode.getNodeType() == Node.ELEMENT_NODE) { 
       Element eElement = (Element) nNode; 
       System.out.println(eElement.getElementsByTagName("code").item(0).getTextContent()); 
      } 
     } 
    } catch (Exception e) { 
      JOptionPane.showMessageDialog(null, e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); 
      System.exit(1); 
     } 

Wir können auch, Code holen, indem jedes Jahr Looping -> Semester -> Modul, holen dann die Attributcode. Obige Code gibt folgende Ergebnisse:

HCA1105C PROG1115C MATH1103C ITE1107C MGMT1101C PROG1116C WAT1116C MATH1101C DBT1111C CAN2112C WAT2117C OSS2109C PROG2117C SDT2114C MATH2323C MCT2104C MCT2104C WAT2124C MGMT2104C SECU3119C MULT3114C SEM3112C SDT3104C WAT3125C SEM3113C MGMT3105C PROJ3105C