2016-05-12 2 views
0

Gibt es aa Weg für zwei Tag-Namen in DOM Abfrage mit dem ‚getElementsByTagName‘Abfrage für zwei Elemente unter Verwendung von DOM-XML in JAVA

Ich versuche, mein Programm Parsing und XML-Daten aus zwei verschiedenen Tags „Schulen zu machen "&" Krankenhäuser "und die Attribute" ID "und" Text "von jedem

anzeigen

Ist das möglich?

Mein Code ist:

import java.io.IOException; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 

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

public class DomParse { 

    public static void main(String[] args) { 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 

    try { 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     Document doc = builder.parse("input2.xml"); 

    NodeList School = doc.getElementsByTagName("School"); 
    for(int i=0;i<School.getLength();i++){ 
     Node p = School.item(i); 
     if(p.getNodeType()==Node.ELEMENT_NODE){ 
      Element person = (Element) p; 
      String id = person.getAttribute("id"); 
      NodeList nameList = person.getChildNodes(); 
      for(int j=0;j<nameList.getLength();j++){ 
       Node n = nameList.item(j); 
       if(n.getNodeType()==Node.ELEMENT_NODE){ 
        Element name = (Element) n; 
        System.out.println("School " + id + ": " + "\n" + "\n" + name.getTextContent()); 

        NodeList Hospital = doc.getElementsByTagName("Hospitals"); 
        for(int z=0;z<Hospital.getLength();z++){ 
         Node k = Hospital.item(z); 
         if(k.getNodeType()==Node.ELEMENT_NODE){ 
         Element uc = (Element) k; 
         NodeList uniqueList = uc.getChildNodes(); 
         for(int l=0;l<uniqueList.getLength();l++){ 
         Node a = uniqueList.item(l); 
          if(a.getNodeType()==Node.ELEMENT_NODE){ 
           Element uniqcon = (Element) a; 
           System.out.println("Hospitals " + id + ": " + "\n" + "\n" + uniqcon.getTextContent() + "\n"); 

          } 
         } 
         } 
        } 
       } 
      } 
     } 
    } 

    } catch (ParserConfigurationException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SAXException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
} 
} 

} 

Die Eingabedatei ist:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> 
<school> 
<Hospitals size="standard"> 
     <Hospital codeSet="base" included="true" analysis="nI" definedAt="scan" id="0"> 
      <text>New England Medical. Services only urgent procedures.</text> 
      <scanPatterns> 
       <scanPattern occurs="1" scanPatternId="45" definedAt="scan" id="0"/> 
       <scanPattern occurs="1" scanPatternId="46" definedAt="scan" id="1"/> 
      </scanPatterns> 
     </Hospital> 

     <Hospital codeSet="base" included="true" analysis="I" SchoolId="4" definedAt="scan" id="1"> 
      <text>Gibson Memorial. 20 miles away.</text> 
      <scanPatterns> 
       <scanPattern occurs="1" scanPatternId="42" definedAt="scan" id="0"/> 
       <scanPattern occurs="1" scanPatternId="39" definedAt="scan" id="1"/> 
      </scanPatterns> 
     </Hospital> 
     </Hospitals> 
<Schools> 
     <School definedAt="scan" id="0"> 
      <text>Craven County Middle School</text> 
     </School> 
     <School definedAt="scan" id="1"> 
      <text>WestLake Middle School</text> 
     </School> 
     </Schools> 
</school> 
+1

in der DOM-Navigation ist schmerzhaft, für einen einfacheren Weg, einen Blick auf XPath nehmen Um auf Werte im Dokument zuzugreifen http://stackoverflow.com/a/2811101/3215527 – wero

+0

Sie könnten eine Methode erstellen, die eine 'NodeList' als Eingabe erhält, die Elemente durchläuft und die gewünschten Werte ausgibt. Unter der Voraussetzung, dass der Name der Methode "printElements" lautet, können Sie ihn mit 'printElements (doc.getElementsByTagName (" School) "' und 'printElements (doc.getElementsByTagName (" Hospital ") aufrufen.) Außerdem: Warum drucken Sie alle Krankenhäuser für jeden aus? Schule? –

Antwort

0

Wenn Sie XPath verwenden, wird diese Arbeit viel einfacher sein.

XPath xPath = XPathFactory.newInstance().newXPath(); 
String schoolExpression = "//School"; 
String hospitalExpression = "//Hospital"; 

Holen Sie sich einen NodeList des XPath-Ausdruck verwendet wird, dann über den Knoten durchlaufen und die ID und Textinhalt erhalten:

NodeList nodeList = (NodeList) xPath.compile(schoolExpression).evaluate(xmlDocument, XPathConstants.NODESET); 
for (int i = 0; i < nodeList.getLength(); i++) { 
     System.out.println(nodeList.item(i).getAttributes().getNamedItem("id").getNodeValue()); // gets you your id 
     System.out.println(nodeList.item(i).getTextContent()); // gets you the context   
} 
Verwandte Themen