7

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);
    }  
} }

1

2 Answers 2

2

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);                      
                }
            }
        }
Sign up to request clarification or add additional context in comments.

Comments

1

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.