Parsing XML using Java to get element values ​​and attribute values

I have an XML file and the elements also have attributes. I have a simple java file that parses and prints the values ​​of elements in a text file, but not the values ​​of the element attributes. Please, you can help in getting attribute values ​​for printing as well. I insert the code below: -------- employee.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); } } } 

+7
source share
2 answers

Since you are using org.w3c.dom, you can 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); } } } 
+1
source

What you use is the XSLT transform, which by default is converted to element texts.

Using the same method, you need your own "style sheet":

  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 the resource, not the 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> 

What will create:

 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. 
+1
source

All Articles