2016-05-12 2 views
2

У меня есть XML, как это:Java XML узла внутри узла Значение

<cargalery> 
    <garage garagetype="Expensive" garagename="Garage1"> 
     <cars cartype="faster" carname="Car4" /> 
     <cars cartype="faster" carname="Car5" /> 
     <cars cartype="slower" carname="Car6" /> 
    </garage> 
    <garage garagetype = "Cheap" garagename="Garage2"> 
     <cars cartype="slower" carname="Car1" /> 
     <cars cartype="faster" carname="Car2" /> 
     <cars cartype="slower" carname="Car3" /> 
    </garage> 
</cargalery> 

Я могу читать гаражных узлы с этим:

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
URL u = new URL("xmlurl"); 
Document doc = builder.parse(u.openStream()); 
doc.getDocumentElement().normalize(); 

System.out.println("Root element :" + doc.getDocumentElement().getNodeName());  
NodeList NodeOzet = doc.getElementsByTagName("garage");  

for (int temp = 0; temp < NodeOzet.getLength(); temp++) 
{ 
    Node nOzet = NodeOzet.item(temp); 
    System.out.println("\nCurrent Element :" + nOzet.getNodeName()); 

    if (nOzet.getNodeType() == Node.ELEMENT_NODE) 
    { 
    Element eElement = (Element) nOzet;  
    System.out.println("Garage Name : " + eElement.getAttribute("garagename")); 
    } 
} 

Но я не могу читать гараж внутри машины. Как я могу читать автомобили внутри гаража?

Спасибо.

+0

Я думаю, что вы можете сделать что-то вроде этого: NodeList cars = NodeOzet.item (temp) .getChildNodes() ' – Titus

+0

@Titus Я пробовал это, но он возвращает null. Даже я пытаюсь добавить toString или т. Д. –

ответ

1

Для Element определен метод getAttribute("AttributeName").

Если вы хотите, чтобы названия автомобилей внутри гаража вы делали правильно, создав NodeList во всех элементах по имени тега «гараж», тогда вы должны создать вложенный цикл, чтобы получить все элементы по тегу Назовите «автомобили» в своем гараже.

for (int temp = 0; temp < NodeOzet.getLength(); temp++){ 
     Node nOzet = NodeOzet.item(temp); 
     NodeList carList = eElement.getElementsByTagName("cars") 
     String cars = ""; 
     for(int temp2 = 0; temp2 < carList.getLength(); temp2++){ 
      cars += ((Element)carList.item(temp2)).getAttribute("carname") + "\t"; 
     } 
    } 

Как это для каждого гаража вы получите все автомобили в гараже, и их имена

+0

Это хорошо работает. Спасибо. Но вы должны изменить NodeList carList = eElement.getElementsByTagName («автомобили»); –

+0

Спасибо, ты прав –

0

В xml все узлы от комментариев к тексту. Вы можете получить все дочерние узлы этого элемента, а затем получить атрибуты узла элемента. Добавьте следующий код в оператор if.

NodeList childNodes = eElement.getChildNodes(); 
for(int i = 0; i < childNodes.getLength(); i++){ 
    Node item = childNodes.item(i); 
    if(item.getNodeType() != Node.ELEMENT_NODE){ 
     continue; 
    } 
    NamedNodeMap attributes = item.getAttributes(); 
    System.out.print("  Carname : " + attributes.getNamedItem("carname")); 
    System.out.println("\t type : " + attributes.getNamedItem("cartype")); 
} 

Выход:

Root element :cargalery 

Current Element :garage 
Garage Name : Garage1 
    Carname : carname="Car4" type : cartype="faster" 
    Carname : carname="Car5" type : cartype="faster" 
    Carname : carname="Car6" type : cartype="slower" 

Current Element :garage 
Garage Name : Garage2 
    Carname : carname="Car1" type : cartype="slower" 
    Carname : carname="Car2" type : cartype="faster" 
    Carname : carname="Car3" type : cartype="slower" 
0

вы можете попробовать xpath выражения, а

import java.io.ByteArrayInputStream; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathConstants; 
import javax.xml.xpath.XPathExpression; 
import javax.xml.xpath.XPathFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

public class MyXML { 

    public static void main(String[] args) throws Exception { 
     XPathFactory xPathfactory = XPathFactory.newInstance(); 
     XPath xpath = xPathfactory.newXPath(); 

     XPathExpression expr = xpath.compile("/cargalery/garage/cars | /cargalery/garage"); 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 

     DocumentBuilder builder = factory.newDocumentBuilder(); 
     Document doc = builder.parse(new ByteArrayInputStream((
      "<cargalery>" + 
      "<garage garagetype = \"Expensive\" garagename = \"Garage1\">" 
      + "  <cars cartype=\"faster\" carname=\"Car4\"/>" + 
      "  <cars cartype=\"faster\" carname=\"Car5\"/>" 
      + "  <cars cartype=\"slower\" carname=\"Car6\"/>" + 
      "</garage>" + 
      "<garage garagetype = \"Cheap\" garagename = \"Garage2\">" 
      + "  <cars cartype=\"slower\" carname=\"Car1\"/>" + 
      "  <cars cartype=\"faster\" carname=\"Car2\"/>" 
      + "  <cars cartype=\"slower\" carname=\"Car3\"/>" + 
      "</garage>" + 
      "</cargalery>").getBytes())); 

     NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET); 
     for (int i = 0; i < nl.getLength(); i++) { 
      Node item = nl.item(i); 
      if ("garage".equals(item.getNodeName())){ 
       System.out.println(item.getNodeName()+":"+((Element)item).getAttribute("garagename")); 
      }else if ("cars".equals(item.getNodeName())) { 
       System.out.println(item.getNodeName()+":"+((Element)item).getAttribute("carname")); 
      } 
     } 
    } 
} 

выходы

garage:Garage1 
cars:Car4 
cars:Car5 
cars:Car6 
garage:Garage2 
cars:Car1 
cars:Car2 
cars:Car3 
+0

Спасибо за комментарий. Я исправил без xpath. –

0

Вы можете использовать синтаксический анализатор SAX, который он работает над событиями, он будет генерировать событие на каждом собрании элемент (по пункту, понимать все виды элементов: открывающий тег, закрывающий тег ...) .Здесь является примером его использования:

public void startElement(String namespaceURI, String lname, 
     String qname, Attributes attrs) throws SAXException { 

    System.out.println("---------------------------------------------"); 
    //cette variable contient le nom du nœud qui a créé l'événement 
    System.out.println("qname = " + qname); 
    node = qname; 

    //Cette dernière contient la liste des attributs du nœud 
    if (attrs != null) { 
     for (int i = 0; i < attrs.getLength(); i++) { 
     //nous récupérons le nom de l'attribut 
     String aname = attrs.getLocalName(i); 
     //Et nous affichons sa valeur 
     System.out.println("Attribut " + aname + " valeur : " + attrs.getValue(i)); 
     } 
    } 
} 

public void endElement(String uri, String localName, String qName) 
     throws SAXException{ 
    System.out.println("Fin de l'élément " + qName);  
} 

public void characters(char[] data, int start, int end){ 
    System.out.println("***********************************************"); 
    //La variable data contient tout notre fichier. 
    //Pour récupérer la valeur, nous devons nous servir des limites en paramètre 
    //"start" correspond à l'indice où commence la valeur recherchée 
    //"end" correspond à la longueur de la chaîne 
    String str = new String(data, start, end); 
    System.out.println("Donnée du nœud " + node + " : " + str); 

} 

и здесь является основным классом:

import java.io.IOException; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 
import javax.xml.transform.TransformerFactoryConfigurationError; 
import org.w3c.dom.DOMException; 
import org.xml.sax.SAXException; 

public class Main { 

    public static void main(String[] args) { 

     try { 
     SAXParserFactory factory = SAXParserFactory.newInstance(); 
     SAXParser parser = factory.newSAXParser(); 

     parser.parse("test.xml", new MyXMLHandler()); 

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

Спасибо за ваш ответ –

Смежные вопросы