2012-03-18 11 views
7

Tengo un archivo XML y los elementos también tienen atributos. Tengo un archivo java simple que analiza e imprime valores de elementos en un archivo de texto pero no valores de atributos de elementos. Por favor, puede ayudar a conseguir que los valores de los atributos también se impriman. Estoy pegando el código de abajo: archivo Employees.xml -------- -----------XML analizando usando Java para obtener valores de elementos y valores de atributos

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

+0

ver enlace http://stackoverflow.com/questions/9781568/update-data-in-java-class-as -per-change-in-attribute-in-the-xml-file/9783154 # 9783154 –

Respuesta

1

dado que está utilizando org.w3c.dom puede utilizar lo siguiente:

 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

W El sombrero que está utilizando es una transformación XSLT que, por defecto, se transforma en texto de elementos.

Utilizando la misma técnica, se necesita una propia "hoja de estilo":

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

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

encima utilicé un recurso, no un archivo del sistema de archivos, por lo que está lleno de la aplicación.

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> 

que produciría:

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. 
Cuestiones relacionadas