Odczyt fragmentu pliku xml w javie

0

Cześć. Starałem się znaleźć istniejący już temat z podobnym problemem. Jeśli taki był i go przeoczyłem, przepraszam. W tworzonej aplikacji w pewnym momencie muszę wyciągnąć konkretną wartość z pliku xml. Mam w nim listę przystanków i informacje na temat każdego z nich. Chciałbym, żeby aplikacja przeszła przez cały plik i jeśli przystanek nazywa się np. Kraków, to do String zostanie przypisana nazwa ulicy tej konkretnej stacji. Nie potrzebuję wszystkich ulic, tylko tej jednej. Na ten moment w konsoli wyświetlają mi się wszystkie informacje nt. każdej ze stacji. Jak to zrobić? Wielkie dzięki za każdą pomoc. :)

public class TicketPrice 
{
    public void showTicketPrice(List<Integer> listWithID) throws IOException, SAXException
    {
        try
        {
            String dir = System.getProperty("user.dir");    
            int routeID = listWithID.get(0);
            
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(dir+ "/routes/" + routeID + ".xml"); 
            NodeList stationList = doc.getElementsByTagName("station");
                for(int i = 0; i < stationList.getLength(); i++)
                {
                    Node s = stationList.item(i);
                    if(s.getNodeType()==Node.ELEMENT_NODE)
                    {
                        Element station = (Element) s;
                        NodeList infoList = station.getChildNodes();
                        for(int j = 0; j < infoList.getLength(); j++)
                        {
                            Node n = infoList.item(j);
                            if(n.getNodeType()==Node.ELEMENT_NODE)
                            {
                                Element info = (Element) n;
                                System.out.println(info.getTagName() + " " + info.getTextContent());
                            }
                        }
                    }
                }
        } 
        
        catch (ParserConfigurationException ex) 
        {
            Logger.getLogger(TicketPrice.class.getName()).log(Level.SEVERE, null, ex);
        }
    
    }   
}

Przykładowy plik xml (jest kilka tras) wygląda tak:

<?xml version="1.0" encoding="UTF-8"?>
<route>
	<station id="1">
    		<city>KRAKOW</city>
    		<street>UL. BOSACKA 18</street>
    		<departureTime>9:30</departureTime>
		<distanceFromID1>0</distanceFromID1>
  	</station>
  	<station id="2">
    		<city>KATOWICE</city>
    		<street>UL. SKARGI 1</street>
    		<departureTime>10:45</departureTime>
		<distanceFromID1>81</distanceFromID1>
  	</station>
	<station id="3">
    		<city>GLIWICE</city>
    		<street>UL. PLAC PIASTOW 6</street>
    		<departureTime>11:10</departureTime>
		<distanceFromID1>109</distanceFromID1>
  	</station>
	<station id="4">
    		<city>WROCLAW</city>
    		<street>UL. SUCHA 1</street>
    		<departureTime>13:35</departureTime>
		<distanceFromID1>272</distanceFromID1>
  	</station>
	<station id="5">
    		<city>ZMIGROD</city>
    		<street>UL. KOLODZIEJA 22</street>
    		<departureTime>14:05</departureTime>
		<distanceFromID1>326</distanceFromID1>
  	</station>
	<station id="6">
    		<city>SREM</city>
    		<street>UL. SADOWA 1</street>
    		<departureTime>15:00</departureTime>
		<distanceFromID1>411</distanceFromID1>
  	</station>
	<station id="7">
    		<city>POZNAN</city>
    		<street>UL. MATYI 2</street>
    		<departureTime>16:05</departureTime>
		<distanceFromID1>464</distanceFromID1>
  	</station>
</route>
3

Możesz użyć XPath z javax.xml.xpath, nie jest to najprzyjemniejsze API ale możliwe że zrobi co trzeba:

        XPathFactory xPathFactory = XPathFactory.newInstance();
        XPathExpression xPathExpression = xPathFactory.newXPath().compile("//station[city/text() = 'KRAKOW']/street/text()");
        NodeList nodeList = (NodeList) xPathExpression.evaluate(doc, XPathConstants.NODESET);
        for (int i = 0; i < nodeList.getLength(); i++) {
            System.out.println(nodeList.item(i).getTextContent());
        }
0

Działa, dziękuję, chętnie postawiłbym Ci piwo za tę pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1