I am trying to go through a XML-document in a generic way, as in knowing nothing about it, except how many levels it has:
<nodelevel1> <nodelevel2 attribute="xyz"> </nodelevel2> </nodelevel1> Therefore I took this XML-document and extracted all the information in it in a generic way (so no XPath, no .getElementsByTagName("carname").item(0).getTextContent(), etc.). I do this in order to understand working with XML better, not in order to have a perfect solution, I'm aware that there are simpler / better solutions. This is for learning purposes only.
I was able to get all the information out in a generic way except for the attributes company="Ferrari", company="Lamborgini", etc. I had to use "Company: " + eElement.getAttribute("company").
So how can I get the attributes of the nodes (here the companies) without specifying them?
sportscars.xml
<?xml version="1.0"?> <cars> <supercars company="Ferrari"> <carname type="formula one">Ferarri 101</carname> <carname type="sports car">Ferarri 201</carname> <carname type="sports car">Ferarri 301</carname> </supercars> <supercars company="Lamborgini"> <carname>Lamborgini 001</carname> <carname>Lamborgini 002</carname> <carname>Lamborgini 003</carname> </supercars> <luxurycars company="Benteley"> <carname>Benteley 1</carname> <carname>Benteley 2</carname> <carname>Benteley 3</carname> </luxurycars> </cars> My java-class QueryXMLFileDemo.java:
public class QueryXmlFileDemo { public static void main(String[] args) { try { File inputFile = new File("sportcars.xml"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document inputDocument = dBuilder.parse(inputFile); inputDocument.getDocumentElement().normalize(); Node carsNode = inputDocument.getFirstChild(); NodeList carsNodeList = carsNode.getChildNodes(); for (int i = 0; i < carsNodeList.getLength(); i++) { Node carTypes = carsNodeList.item(i); String attributeName = carsNodeList.item(i).getNodeName(); System.out.println("Attribute Name: " + attributeName); // hides the #text-entries if (Node.ELEMENT_NODE != carTypes.getNodeType()) { continue; } if (carTypes.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) carTypes; // Line I want to do generically without specifying the attributes name System.out.println("Company: " + eElement.getAttribute("company")); } System.out.println("CarType: " + carTypes.getNodeName()); NodeList carNamesList = carTypes.getChildNodes(); for (int j = 0; j < carNamesList.getLength(); j++) { Node carNameNode = carNamesList.item(j); if (Node.ELEMENT_NODE != carNameNode.getNodeType()) { continue; } System.out.println("Car: " + carNameNode.getTextContent()); } System.out.println(""); } } catch (Exception e) { } } } Output:
Company: Ferrari CarType: supercars Car: Ferarri 101 Car: Ferarri 201 Car: Ferarri 301 Company: Lamborgini CarType: supercars Car: Lamborgini 001 Car: Lamborgini 002 Car: Lamborgini 003 Company: Benteley CarType: luxurycars Car: Benteley 1 Car: Benteley 2 Car: Benteley 3
No comments:
Post a Comment