JAVA中怎么读取XML文件呢?假如我的XML是这样的,我应该怎么去解析呢,求具体代码!
<小说>
 <类型>
  <言情小说>
   <书名>
    <爱情>
     <作者>大大</作者>
     <出版日期>2888年8月18号</出版日期>  
    </爱情> 
   </书名>
  </言情小说>
 </类型>
</小说>

解决方案 »

  1.   

    look here
    希望对你有用
      

  2.   

    InputStream in = MyXMLReaderDOM4J.class.getClassLoader()
    .getResourceAsStream("resource.xml");
    SAXReader reader = new SAXReader();
    Document doc = reader.read(in);
    Element root = doc.getRootElement();
    for (Object o : (List<?>) root.elements("类型")) {
      Element e = (Element) o;
       System.out.print("言情小说:" + e.elementText("言情小说"));
       System.out.println(" 书名:" + e.elementText("v"));
    }
      

  3.   


    范例package sample;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 MyXMLReader {
    public static void main(String[] args){
    long lasting =System.currentTimeMillis(); 
    try{ 
    File f=new File("C:/lsdj.xml"); 
    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder=factory.newDocumentBuilder(); 
    Document doc = builder.parse(f); 
    NodeList nl = doc.getElementsByTagName("VALUE"); 
    for (int i=0;i<nl.getLength();i++){ 
    System.out.println("车牌号码:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue()); 
    System.out.println("车主地址:" 
    + doc.getElementsByTagName("ADDR").item(i)
    .getFirstChild().getNodeValue());

     }catch(Exception e){ 
    e.printStackTrace(); 
    }
    System.out.println("运行时间:"+(System.currentTimeMillis() - lasting)+"毫秒"); 
    }

    }
    <?xml version="1.0" encoding="GB2312"?>
    <RESULT> 
    <VALUE>
    <NO>A1234</NO> 
    <ADDR>四川省XX县XX镇XX路X段XX号</ADDR> 
    </VALUE>
    <VALUE> 
    <NO>B1234</NO>
    <ADDR>四川省XX市XX乡XX村XX组</ADDR> 
    </VALUE>
    </RESULT>
      

  4.   

    JDOM   看下它的API 把相关代码拷过来稍微修改就行了
      

  5.   

    你们动作太快~我没得说了~dom4J来很方便
    首先读取根节点
    然后将子节点遍历一下就好!
    获得对象之后项怎么干貌似在dom4j里有写了方法了!
      

  6.   

    对于读取节点,今天整了一天,基本知道怎么用了,但是不知道怎么读取里面的内容,比如:<作者>大大</作者>
    这里面作者的名字:大大,应该怎么读出来呢
      

  7.   

    假如我的XML文件是这样的,
    <novels>
        <小说 type="武侠小说">
        </小说>
    </novels>
    我要读取属性,也就是type="武侠小说"应该怎么做呢
      

  8.   


    xml的解析
      1.解析式为了得到里面的内容,进行增,删,改查的操作  XML的解析方式
      SAX(Simple API for XML)xml文档的一种简单的解析方式
      DOM(Document Object Model)
      DOM4J
      SAX:基于事件的解析方式
      DOM: 基于对象的解析方式
      事件监听三要素
      1.事件源
      2.监听器
      3.事件
    SAX 基于事件的解析
      优点: 简单 效率高
      缺点:顺序执行,不能得到某个元素 不能逆向执行
           不能进行增,与删的操作
    SAX解析方式工作原理:
    通过时间源xml文档创建SAXParseFactory
    SAXParserFactory factory=SAXParserFactory.newInstance();
     得到一个解析器
    SAXParser parse=factory.newSAXParser();
    对xml文件进行解析
    得到解析的文件对象
     File file=new File("employees.xml");
    通过监听器进行解析
     MyListener listener=new MyListener();
    parse.parse(file,listener);
    对于监听器有5个方法:监听器所在的类实现的接口有:
    org.xml.sax.hepers.DefaultHandler
    org.xml.sax
    通过查看API文档中的DefaultHandler类中的下面5个方法
    startDocument() 对于文档开始的解析
    public void startDocument()throws SAXException{
    System.out.println("文档开始解析啦!!!!");
    }
    startElement()元素开始的解析其中几个名词 
     url:命名空间的url
     localName:命名空间的前缀
     qName:元素
     attributes:元素里的属性
    public void startElement(String url,String localName,String qName,Attributes attributes)throws SAXException{
    StringBuffer sb=new StringBuffer();
    sb.append("<"+qName);
    for(int i=0;i<attributes.getLength();i++){
    String attName=attributes.getQName(i);获得元素属性名称其中的i为元素的第几个属性
    String attValue=attributes.getValue(i);获得元素属性的值其中的i为元素的第几个属性的值
    sb.append(attName+"="+attValue);
    }
    sb.append(">");
    System.out.print(sb.toString());
    }
    character()获得元素的内容体
    public void characters(char[]ch,int start,int length)throws SAXException{
    System.out.print(new String(ch,start,length));
    }
    endElement()获得元素的结束事件
    public void endElement(String url,String localName,String qName)throws SAXException{
    System.out.print("</"+qName+">");
    }
    endDocument()获得文档的结束事件
      public void endDocument(){
    System.out.println("文档解析结束啦!!!!");
    }
    对于SAX解析只能逐行解析不能越行解析
    DOM:基于对象的
      优点:灵活,能进行增删的操作
      缺点:读取速度慢,效率低 占用的内容多
    对于DOM解析:不需要添加监听器,按级解析从根元素、一级子元素、二级子元素......
    同SAX解析相同刚开始也是要得到一个解析器;
    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance() ;
    因为构造方法不可用不可以new对象只能用newInstance()方法得到解析器对象
    DocumentBuilder builder=factory.newDocumentBuilder() ;得到一个解析器
    对于document可以有两种方法得到:
    Document document= builder.parse(new File(文件路径));通过parse方法解析一个已有的xml文档
    Document document=builder.newDocument();可以得到一个空的document对象
    得到根节点
    Element root=document.getDocumentElement();
    如果不存在根节点即为一个空document对象的时候只能添加跟节点
    Element root=document.createElement(根节点的名字)
    得到根节点下面的所有一级子元素
    NodeList list=root.getElementsByTagName(根节点的名字可以用root.getTagName或者root.getNodeName()得到根节点的名字)();
    {
    对与document可以添加一级子元素
    不管document是否为空都可以添加
    Element firstElements =root.creatElement(一级子元素的名字);
    当然也可以为一级子元素添加属性
    一级子元素的名字.setAttribute("属性名","属性值");
    }
    通过遍历list集合
    for(int i=0;i<list.getLength();i++){
    Element first_elements=(Element)list.item(i);
    可以得到一级资源的属性的值当知道属性的时候
    String attribute=first_elements.getAttribute("属性的名字");
    得到一级子元素的名字
    String first_elements_name=first_elements.getNodeName();
    得到一级子元素下面所有的元素如id 第一个id元素当然也可有很多个id
    通过item()来确定要取那个id
    Element id_element=(Element)first_elements.getElementByName("id").item(0);
    得到id的值
    String id_value=id_element.getFirstChild().getTextContent();
    通过这个遍历集合可以拿到所有子元素
    }
    DOM添加或删除元素:
    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance() ;
    因为构造方法不可用不可以new对象只能用newInstance()方法得到解析器对象
    DocumentBuilder builder=factory.newDocumentBuilder() ;得到一个解析器
    对于document可以有两种方法得到:
    Document document= builder.parse(new File(文件路径));通过parse方法解析一个已有的xml文档
    Document document=builder.newDocument();可以得到一个空的document对象
    得到根节点
    Element root=document.getDocumentElement();
    如果不存在根节点即为一个空document对象的时候只能添加跟节点
    Element root=document.createElement(根节点的名字)
    对与document可以添加一级子元素
    不管document是否为空都可以添加
    Element firstElements =root.creatElement(一级子元素的名字);
    当然也可以为一级子元素添加属性
    一级子元素的名字.setAttribute("属性名","属性值");
    添加二级子元素
    Element secondElements=firstElements.creatElement("二级子元素的名字");
    挂载组装
    一级子元素firstElements.append(secondElements);
    根节点root.appendChild(firstElements);
    将document对象树写入磁盘
    TransformerFactory tf=TransformerFactory.newInstance();
    Transformer former=tf.newTransformer();
    DOMSource source=new DOMSource(document);
    StreamResult result= new StreamResult(new File("10.xml"));结果集
    former.transform(source,result);
    完毕
    DOM4j需要借助外部jar包
    需要借助外部jar包就必须设置环境变量中的classpath把classpath设置成
    dom4j jar包存在的路径(绝对路径)
    例如:
    set classpath=.;C:\Documents and Settings\Administrator\桌面\day3\dom4j.jar
    import org.dom4j.io.*;
    import java.io.*;
    import java.util.*;
    import org.dom4j.*;
    public static void read_XML(String fileName){
    try{
    //得到一个解析器,相当于SAX,DOM里面的解析器工厂,与解析器
    SAXReader reader=new SAXReader();
    //得到一个对象树
    Document document=reader.read(new File(fileName));
    //得到一个根元素
    Element root=document.getRootElement();
    System.out.println(root.getName());
    //得到所有的一级子元素
    List firstElements=root.elements();
    Iterator it=firstElements.iterator();
    while(it.hasNext()){
    //依次得到每一个一级子元素
    Element firstElement=(Element)it.next();
    System.out.println(firstElement.getName());
    //得到所有的属性
    List attributes=firstElement.attributes();
    for(Object obj:attributes){
    //依次得到每一个属性
    Attribute att=(Attribute)obj;
    System.out.println(att.getName()+"="+att.getValue());
    }
    //得到一级子元素下面的所有元素,及其附带值
    List second_Elements=firstElement.elements();
    Iterator second_Element=second_Elements.iterator();
    while(second_Element.hasNext()){
    Element sec_Element=(Element)second_Element.next();
    System.out.println(sec_Element.getName()+":"+sec_Element.getText()); }
    System.out.println("----------");
    }
    }catch(Exception e){ }
    }
    public static void write(String fileName){
    try{
    Document document = DocumentHelper.createDocument();
    //创造一级子元素
    Element books=document.addElement("books");
    books.addComment("The book is J2EE");
    Element book=books.addElement("book");
    创建元素的属性
    book.addAttribute("show","yes");
    book.addAttribute("page","100");
    创建二级子元素
    Element book_name=book.addElement("bookName");
    创建元素的内容体
    book_name.setText("xml");
    Element book_price=book.addElement("bookPrice");
    book_price.setText("3000");
    Element book_press=book.addElement("bookPress");
    book_press.setText("etoak");
    Element book_author=book.addElement("bookAuthor");
    book_author.setText("Robin");
    //挂载另一个一级子元素
    book=books.addElement("book");
    book.addAttribute("show","NO");
    book.addAttribute("page","200");
    book_name=book.addElement("bookName");
    book_name.setText("葵花宝典");
    book_price=book.addElement("bookPrice");
    book_price.setText("无价之宝");
    book_press.addElement("bookPress");
    book_press.setText("华山派");
    book_author=book.addElement("bookAuthor");
    book_author.setText("林平之");
    //创建xml文件输出的路径
    OutputFormat format=OutputFormat.createPrettyPrint();
    format.setEncoding("gbk");
    XMLWriter xw=new XMLWriter(new FileOutputStream(fileName),
    format);
    //XMLWriter xx= new XMLWriter(System.out,OutputFormat.createPrettyPrint());
    xw.write(document);
    xw.flush();
    xw.close();
    }catch(Exception e){
    对于DOM4j添加子元素,是一级一级的添加的而在DOM中是先创造
    子元素然后再挂载的DOM4j在创建子元素的时候就确定好了顺序
    对于文件的输出各有千秋各有特色其中SAX是需要添加监听器的
    }
    }
    public static void update(String fileName){
    try{
    SAXReader reader= new SAXReader();
    Document document = reader.read(new File(fileName));
    Element root = document.getRootElement();
    System.out.println(root.getName());
    在根节点上添加一级子元素
    Element student=root.addElement("student");
    Element id=student.addElement("id");
    id.setText("007");
    OutputStream os= new FileOutputStream(fileName);
    OutputFormat format = OutputFormat.createPrettyPrint();
    XMLWriter xw = new XMLWriter(os,format);
    xw.write(document);
    xw.flush();
    xw.close();
    }catch(Exception e){
    和创建一个新的document对象类似只不过这个的根节点已经存在
    直接可以在根节点上添加一级子元素;
    }
    }
      

  9.   

    XPathReader 在这里 http://blog.csdn.net/afer198215/article/details/6851428static void t4(){
    String xml  = "<?xml version=\"1.0\" encoding=\"GB2312\"?>"
    + "<小说>"
    + "<类型>"
    + "<言情小说>"
    + "<书名>"
    + "<爱情>"
    + "<作者>大大</作者>"
    + "<出版日期>2888年8月18号</出版日期>"
    + "<property name=\"barcode\">37459033-CD-E2</property>"
    + "</爱情>" 
    + "</书名>"
    + "</言情小说>"
    + "</类型>"
    + "</小说>";
    XPathReader xpReader = XPathReader.createXmlReaderByXml(xml);

    System.out.println(xpReader.getText("//小说/类型/言情小说/书名/爱情/作者"));
    System.out.println(xpReader.getText("//小说/类型/言情小说/书名/爱情/出版日期"));
    System.out.println(xpReader.getAttribute("//小说/类型/言情小说/书名/爱情/property", "name"));
    System.out.println(xpReader.getText("//小说/类型/言情小说/书名/爱情/property[@name='barcode']"));
    }
      

  10.   

    pull解析
    sax解析public class PULLPersonService {

    public List<Person> getPersons(InputStream inStream) throws Throwable {
    List<Person> persons=null;
    Person person=null;

    XmlPullParser parser=Xml.newPullParser();  //得到pull解释器
    parser.setInput(inStream, "UTF-8");  //设置输入  编码格式
    int eventType = parser.getEventType();   //产生第一个事件 start_document

    while(eventType!=XmlPullParser.END_DOCUMENT){
    switch (eventType) {
    case XmlPullParser.START_DOCUMENT:
    persons=new ArrayList<Person>();

    break;

    case XmlPullParser.START_TAG:
    String name=parser.getName();  //获取解释器当前指向的元素名称
    if ("person".equals(name)) {
    person=new Person();
    person.setId(parser.getAttributeValue(0));
    }
    if(person!=null){
    if("name".equals(name)){
    person.setName(parser.nextText());     //获取解释器当前指向元素的下个文本节点的值
    }
    if("age".equals(name)){
    person.setAge(parser.nextText());    
    }
    }
    break;

    case XmlPullParser.END_TAG:
    if ("person".equals(parser.getName())) {
    persons.add(person);
    person=null;
    }
    break;

    default:
    break;
    }
    eventType=parser.next();
    }//while is end

    return persons;
    }
    }public class SAXPersonService { public List<Person> getPersons(InputStream inStream) throws Throwable{

    SAXParserFactory factory=SAXParserFactory.newInstance();
    SAXParser parser=factory.newSAXParser();
    PersonParser personParser =new PersonParser();
    parser.parse(inStream, personParser);
    inStream.close();
    return personParser.getPersons();
    }

    private final class PersonParser extends DefaultHandler {
    private List<Person> persons=null;
    private String tag=null;
    private Person person=null;
    public List<Person> getPersons() {
    return persons;
    }
    public void startDocument() throws SAXException {    //开始
    persons=new ArrayList<Person>();
    } public void characters(char[] ch, int start, int length)   //解析文本节点
    throws SAXException {
    if(tag!=null) {
    String data=new String(ch, start ,length);   //获取文本节点数据
    if("name".equals(tag)) {
    person.setName(data);
    }else if("age".equals(tag)) {
    person.setAge(new String (data));
    }
    }
    } public void endElement(String uri, String localName, String qName)   //遇到</>
    throws SAXException {
    if("person".equals(localName)){
    persons.add(person);
    person=null;
    }

    tag=null;
    } public void startElement(String uri, String localName, String qName,     //遇到<>
    Attributes attributes) throws SAXException {
    if("person".equals(localName)) {
    person=new Person();
    person.setId(new String(attributes.getValue(0)));

    }
    tag=localName;
    }

    }
    }
      

  11.   

    用xquery了貌似也是个不错的选择
      

  12.   

    http://developer.51cto.com/art/200903/117512.htm
    这个不错的