如果我的xml文件是
<?xml version="1.0" encoding="utf-8"?>
<books>
  <book name="book1" class="1" language="1">
    <authors >authors1</authors >
    <press>press1</press>
  </book >
  <book name="book2" class="2" language="2">
    <authors >authors2</authors >
    <press>press2</press>
  </book >
  <book name="book3" class="1" language="2">
    <authors >authors3</authors >
    <press>press3</press>
  </book >
</books>我想根据book的name操作,进行修改和删除,应该怎么写?

解决方案 »

  1.   

    使用dom4j,首先找到你要修改或者删除节点的那个副节点,可以通过xpath或者普通的xml节点查找,然后,用这个父节点进行修改,修改完成后,关键的一步操作是使用XmlWriter将修改的文档写回xml
      

  2.   

    删除:
    Element root=getRoot();//获得你的XML的根节点
    List list = root.getChildren();
    for (int i = 0; i < list.size(); i++)
    {
      Element book=(Element)list.get(i);
      String name=book.getAttributeValue("name");
      if(name.equals("book1"))
      {
        //这里修改或删除
        root.removeContent(book);//删除name='book1'的节点 
        //修改省....
      }
    }
      

  3.   

    dom4j自带的cookbook,里面就有啊,增删改操作。
      

  4.   

    //删除,可直接运行的代码
    import java.io.*;
    import java.util.Iterator;
    import java.util.List;
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.Attribute;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    public class Test{ public static void main(String args[]){
    SAXReader saxReader = new SAXReader();
    Document document=null;
    try
    {
    document = saxReader.read("books.xml");
    List list = document.selectNodes("//books" );
    Iterator iter=list.iterator();
    while(iter.hasNext())
    {
    Element booksElement=(Element)iter.next(); 
    Iterator bookiter=booksElement.elementIterator("book");
    while(bookiter.hasNext())
    {
    Element bookElement=(Element)bookiter.next();
    Iterator attrIter=bookElement.attributeIterator();
    while(attrIter.hasNext())
    {
    Attribute nameAttribute=(Attribute)attrIter.next();
    if(nameAttribute.getName().equals("name")&&nameAttribute.getText().equals("book1"))//name=book1的
    {
    booksElement.remove(bookElement);
    System.out.println("======");
    XMLWriter output = new XMLWriter(new FileWriter("books.xml"));
    output.write( document );
    output.flush();
    output.close();
    break;
    }
    }
    }   
    }
    }
    catch(Exception e){}
    }

      

  5.   

    to Beatles_The(甲虫) 
    你的代码确实多了点,并且逻辑也比较乱,这种情况下,最好是使用xpath。
      

  6.   

    To bit1010(小虾风清扬) 
    这是我修改后的代码,你说的xpath是document.selectSingleNode("//books/book/@name");
    这种格式吗?你还有简便的删除方法吗?请指教!谢谢
    import java.io.*;
    import java.util.Iterator;
    import java.util.List;
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.Attribute;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    public class Test
    {
     public static void main(String args[])
     {
      SAXReader saxReader = new SAXReader();
      Document document=null;
      try
      {
       document = saxReader.read("books.xml");
       Element booksElement =(Element) document.selectSingleNode("//books" );
       List list =document.selectNodes("//books/book");
       Iterator iter=list.iterator();
       while(iter.hasNext())
      {
       Element bookElement = (Element) iter.next();  
       Attribute nameAttribute = (Attribute) document.selectSingleNode("//books/book/@name");
       if(nameAttribute.getText().equals("book1"))//name=book1的
      {
        booksElement.remove(bookElement);
        XMLWriter output = new XMLWriter(new FileWriter("books.xml"));
        output.write( document );
        output.flush();
        output.close();
        break;
      }
     }    
     }
     catch(Exception e){}
     }

    }
      

  7.   

    //上面的代码中,可以去掉document.selectNodes("//books/book");
    import java.io.*;
    import java.util.Iterator;
    import java.util.List;
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.Attribute;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    public class Test
    {
     public static void main(String args[])
     {
      SAXReader saxReader = new SAXReader();
      Document document=null;
      try
      {
       document = saxReader.read("books.xml");
       Element booksElement =(Element) document.selectSingleNode("//books" );
       List list =document.selectNodes("//books/book/@name");
       Iterator iter=list.iterator();
       while(iter.hasNext())
       {
        Attribute nameAttribute = (Attribute) iter.next();  
        if(nameAttribute.getText().equals("book1"))//name=book1的
        {
         booksElement.remove(nameAttribute.getParent());
         XMLWriter output = new XMLWriter(new FileWriter("books.xml"));//回写xml文件
         output.write( document );
         output.flush();
         output.close();
         break;
        }
       }    
     }
     catch(Exception e){}
    }

    }
      

  8.   

    to Beatles_The(甲虫)比你原来的做法,清晰了很多的。
      

  9.   

    dom4j修改了xml文件后重新生成一个同名的xml文件,没有类似修改-保存的操作