2012-03-31 66 views
3

如何从元素中提取属性值。我的xml节点是这样写的 < nodename attribute =“value”>我需要解压出来与另一个字符串进行比较。Java DOM XML解析::获取元素属性值

但是因为我没有调用document.getElementsByTag,所以我不能使用.getAttribute(“att。”)。getNodeValue来获取值。

相反,我有一个NodeList和getAttribute()没有getNodeValue。

package dev; 

import java.io.*; 
import java.util.*; 

import javax.xml.parsers.*; 
import javax.xml.xpath.*; 
import org.w3c.dom.*; 
import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 



public class Parser { 


    static String def = "\"admin\",\"base\",\"Default\",\"simple\""; 

    static String category = ""; 
    static String sku = ""; 
    static String has_options = "0"; 

    static String name = ""; 
    static String image = ""; 
    static String small_image = ""; 
    static String thumbnail = ""; 

    public static void toCSV() { 
     try { 
      BufferedWriter output = new BufferedWriter(new FileWriter("sim.csv", true)); 
      output.newLine(); 
      output.write(def); 
      output.write(String.format(",\"%s\",\"%s\",\"%s\"", category, sku, has_options)); 
      output.write(String.format(",\"%s\",\"%s\",\"%s\",\"%s\"", name, image, small_image, thumbnail)); 
      output.flush(); 
      output.close(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     toCSV(); 
     try { 
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
      factory.setNamespaceAware(true); 
      DocumentBuilder builder = factory.newDocumentBuilder(); 

      Document document = builder.parse(new File("input.asp.xml")); 
      document.getDocumentElement().normalize(); 

      NodeList list = document.getElementsByTagName("izdelek"); 
      for(int i = 0; i < 1; i++) { 
       NodeList child = list.item(i).getChildNodes(); 
       for(int j = 0; j < child.getLength(); j++) { 
        if(child.item(j).getNodeName().equals("kategorija")) { 
         category = child.item(j).getTextContent().trim(); 
        } else if(child.item(j).getNodeName().equals("ean")) { 
         sku = child.item(j).getTextContent().trim(); 
        } else if(child.item(j).getNodeName().equals("izdelekIme")) { 
         name = child.item(j).getTextContent().trim(); 
        } else if(child.item(j).getNodeName().equals("slikaMala")) { 
         small_image = child.item(j).getTextContent().trim(); 
         thumbnail = child.item(j).getTextContent().trim(); 
        } else if(child.item(j).getNodeName().equals("slikaVelika")) { 
         image = child.item(j).getTextContent().trim(); 
        } else if(child.item(j).getNodeName().equals("dodatneLastnosti")) { 
         NodeList subs = child.item(j).getChildNodes(); 
         //^need to parse these nodes they are written as <nodename attribute="value"> 
         // i need to print out the value 
        } 
       } 
       //toCSV(); 
      } 

     } catch(Exception io) { 
      io.printStackTrace(); 
     } 
    } 


} 

回答

5

解决:

XML输入:

< nodename attribute="value" > Something </ nodename> 

Java代码:

NodesList subs = child.item(j).getChildNodes(); 

System.out.println(subs.item(0).getTextContent()); // >> Something 

Element element = (Element) document.adoptNode(subs.item(0)); 
System.out.println(element.getAttribute("attribute")); // >> value 
+2

我建议你看看XPath。 – kdgregory 2012-03-31 13:05:29

0

你也可以利用这一点,

child.item(j).getFirstChild().getNodeValue();