XML parsing using Java with getting element values and attribute values

15,229

Solution 1

Since you are using org.w3c.dom you might use the following:

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        InputSource is = new InputSource(new StringReader(xmlFile));
        Document doc = builder.parse(is);

        NodeList nodeList = doc.getElementsByTagName("Employee");

        for (int i = 0; i < nodeList.getLength(); i++) {                
            Node node = nodeList.item(i);

            if (node.hasAttributes()) {
                Attr attr = (Attr) node.getAttributes().getNamedItem("type");
                if (attr != null) {
                    String attribute= attr.getValue();                      
                    System.out.println("attribute: " + attribute);                      
                }
            }
        }

Solution 2

What you are using is an XSLT transformation which by default transforms to element texts.

Using the same technique, one needs an own "stylesheet":

    InputStream xsltIn = StoreData.class.getResourceAsStream("/employees.xslt");
    StreamSource xslt = new StreamSource(xsltIn);
    ///StreamSource xslt = new StreamSource(".../employees.xslt");

    Transformer tFormer = TransformerFactory.newInstance().newTransformer(xslt);

Above I used a resource, not a file system File, so it is packed with the application.

employees.xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/Personnel">
Personnel:
        <xsl:apply-templates select="./*"/>
End personnel.
    </xsl:template>

    <xsl:template match="Employee">
* Employee:<xsl:apply-templates select="./@*|./*"/>

    </xsl:template>

    <xsl:template match="Name|Id|Age|@type">
  - <xsl:value-of select="name()"/>: <xsl:value-of select="."/>
    </xsl:template>
</xsl:stylesheet> 

Which would produce:

Personnel:

* Employee:
  - type: permanent
  - Name: Seagull
  - Id: 3674
  - Age: 34
* Employee:
  - type: contract
  - Name: Robin
  - Id: 3675
  - Age: 25
* Employee:
  - type: permanent
  - Name: Crow
  - Id: 3676
  - Age: 28
End personnel.
Share:
15,229
user1036204
Author by

user1036204

Updated on June 05, 2022

Comments

  • user1036204
    user1036204 almost 2 years

    i have an XML file and the elements also have attributes. I have a simple java file which is parsing and printing values of elements in a text file but not element attribute values. Please can you help in getting the attributes values also to be printed. I am pasting the code below: --------employees.xml file-----------

    <?xml version="1.0" encoding="UTF-8"?>
    
    <Personnel>
    
      <Employee type="permanent">
        <Name>Seagull</Name>
        <Id>3674</Id>
        <Age>34</Age>
       </Employee>
    
      <Employee type="contract">
        <Name>Robin</Name>
        <Id>3675</Id>
        <Age>25</Age>
    </Employee>
    
      <Employee type="permanent">
        <Name>Crow</Name>
        <Id>3676</Id>
        <Age>28</Age>
      </Employee>
    
    </Personnel>
    

    ----------------------------StoreData.java-----------------------------------------

    import java.io.*;
    import org.w3c.dom.*;
    import org.xml.sax.*;
    import javax.xml.parsers.*;
    import javax.xml.transform.*; 
    import javax.xml.transform.dom.DOMSource; 
    import javax.xml.transform.stream.StreamResult;
    
    public class StoreData{
    static public void main(String[] arg) {
        try{
            BufferedReader bf = new BufferedReader(new       InputStreamReader(System.in));
            System.out.print("Enter XML file name: ");
            String xmlFile = bf.readLine();
            File file = new File(xmlFile);
                if (file.exists()){
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                DocumentBuilder builder = factory.newDocumentBuilder();
                Document doc = builder.parse(xmlFile);
                            //Create transformer
                Transformer tFormer = TransformerFactory.newInstance().newTransformer();
                         //Output Types (text/xml/html)
                tFormer.setOutputProperty(OutputKeys.METHOD, "text");
    //              Write the document to a file
                Source source = new DOMSource(doc);
    //              Create File  to view your xml data as (vk.txt/vk.doc/vk.xls/vk.shtml/vk.html)
                Result result = new StreamResult(new File("file.txt"));
                tFormer.transform(source, result);
                System.out.println("File creation successfully!");
            }
            else{
                System.out.println("File not found!");
            }
        }
        catch (Exception e){
            System.err.println(e);
            System.exit(0);
        }  
    } }