在xml元素中获取属性值

时间:2010-11-09 21:20:18

标签: java xml

我有一个像这样的xml字符串,我希望在每个元素的循环中获取“name”的属性值。我怎么做?我正在使用javax.xml.parsers库。

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

3 个答案:

答案 0 :(得分:68)

怎么样:

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 :(得分:4)

我想我明白了。我必须明确使用org.w3c.dom.Element。我也有一个不同的元素字段。

答案 2 :(得分:1)

以下是在vtd-xml中执行此操作的代码。它基本上使用&#34; / xml / item / @ name的XPath查询XML。&#34;

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