2010-11-09 252 views
23

我有一個這樣的xml字符串,我想在每個元素的循環中獲取「name」的屬性值。我怎麼做?我正在使用javax.xml.parsers庫。在xml元素中獲取屬性值

<xml> 
    <Item type="ItemHeader" name="Plan Features" id="id_1"/> 
    <Item type="Deductible" name="Deductible" id="a">Calendar Year 
     <Item type="Text" name="Individual" id="b">200</Item> 
     <Item type="Text" name="Family" id="c">350</Item> 
    </Item> 
    <Item lock="|delete|" type="Empty" name="Out-of-Pocket Annual Maximum" id="id_2"> 
     <Item type="Text" name="Individual" id="d">400</Item> 
     <Item type="Currency" name="Individual Out-of-Network" id="id_5">$320.00</Item> 
     <Item type="Text" name="Family" id="e">670</Item> 
    </Item> 
    <Item type="Text" name="Life Time Maximum" id="u">8000</Item> 
    <Item type="Text" name="Coinsurance" id="f">60</Item> 
    <Item type="Text" name="Office Visits" id="g">10</Item> 
    <Item type="Text" name="Routine Physicals" id="h">12</Item> 
    <Item type="Text" name="Preventive Care" id="m"/> 
    <Item type="Text" name="Physician Services" id="i"/> 
    <Item type="Text" name="Emergency Room Services/Urgent Care" id="j"/> 
    <Item type="Text" name="Hospital Admission Services" id="k"/> 
    <Item type="Text" name="Chiropractic" id="n"/> 
    <Item type="Text" name="Prescription Drugs" id="l"/> 
    <Item type="Text" name="Specialty Drugs" id="o"/> 
    <Item type="Currency" name="Custom Field 2" id="id_4">$250.00</Item> 
    <Item type="Boolean" name="Pre Tax Reduction Available" id="t">false</Item> 
    <Item type="Boolean" name="Conversion Privilege" id="p">false</Item> 
    <Item type="ItemHeader" name="Plan Setup" id="id_3"/> 
    <Item type="Termination" name="Benefit Termination Date" id="q">Immediate</Item> 
    <Item type="Determination" name="Premium Redetermination Date" id="r">Not Applicable</Item> 
    <Item type="Participation" name="Participation Requirement" id="s"/> 
</xml> 

這是我想到目前爲止

DocumentBuilderFactory dbc = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dbuilder; 
     try { 
      dbuilder = dbc.newDocumentBuilder(); 
      Document doc = dbuilder.parse(new InputSource(new StringReader(plan.getProvisions()))); 
      NodeList nl = doc.getElementsByTagName("Item"); 
      for(int i = 0 ; i < nl.getLength(); i++){ 
       if(i == row){     
        Element e = (Element)nl.item(i); 
        description = e.getAttribute("name"); 
       } 
      } 
     } catch (ParserConfigurationException e) {   
      e.printStackTrace(); 
     } catch (SAXException e) {   
      e.printStackTrace(); 
     } catch (IOException e) {   
      e.printStackTrace(); 
     } 

回答

4

我想我得到了它。我必須明確地使用org.w3c.dom.Element。我也有一個不同的元素字段。

64

如何:

import java.io.File; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.NodeList; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document document = db.parse(new File("input.xml")); 
     NodeList nodeList = document.getElementsByTagName("Item"); 
     for(int x=0,size= nodeList.getLength(); x<size; x++) { 
      System.out.println(nodeList.item(x).getAttributes().getNamedItem("name").getNodeValue()); 
     } 
    } 
} 
1

下面是代碼做到這一點在vtd-xml。它基本上查詢XPath爲「/ xml/item/@ name」的XML。

import com.ximpleware.*; 

public class getAttrs{ 

    public static void main(String[] s) throws VTDException{ 
     VTDGen vg = new VTDGen(); 
     if (!vg.parseFile("input.xml",false)) // turn off namespace 
       return; 
     VTDNav vn = vg.getNav(); 
     AutoPilot ap = new AutoPilot(vn); 
     ap.selectXPath("/xml/item/@name"); 
     int i=0; 
     while((i=ap.evalXPath())!=-1){ 
       System.out.println(" item name is ===>"+vn.toString(i+1)); 
     } 
    } 
}