我用java dom4j解析xml,并修改xml需要把某几个Node下的所有分支都读出,然后再写到另一个xml文件中。我不关心这个Node下的具体内容,不想一个一个分支去读,想把整个Node下的内容整体复制过去。
怎么办?

解决方案 »

  1.   

    我这刚好有个方法,你根据你实际情况修改下就行了!public Vector readXMLFile() throws IOException {
            vector = new Vector<DataInfo>();
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = null;
            org.w3c.dom.Document document = null;
            try {
                builder = factory.newDocumentBuilder();
            } catch (ParserConfigurationException ex) {
                ex.printStackTrace();
            }
            try {
                document = builder.parse(new File("config/dbconfig.xml"));
            } catch (SAXException ex) {
                ex.printStackTrace();
            }        NodeList nodeList = document.getElementsByTagName("data");
            for (int i = 0; i < nodeList.getLength(); i++) {
                DataInfo info = new DataInfo();
                org.w3c.dom.Node fatherNode = nodeList.item(i);
                info.setNumber(i+1);
                info.setIsSelect(Boolean.valueOf(fatherNode.getAttributes().item(0).getNodeValue()));
                info.setIp(fatherNode.getAttributes().item(1).getNodeValue());
                info.setDatabase(fatherNode.getAttributes().item(2).getNodeValue());
                info.setArea(fatherNode.getAttributes().item(3).getNodeValue());
                info.setUsername(fatherNode.getAttributes().item(4).getNodeValue());
                info.setPassword(fatherNode.getAttributes().item(5).getNodeValue());
                vector.add(info);
            }
            return vector;
        }
      

  2.   

    你的方法可以让写入的xml文件中的格式和源文件一样吗?
      

  3.   

    我复制段读取XML节点的函数,希望对你有用。        public String getContent(File file) {
    if(!file.exists()||!(file.getName().endsWith(".xml")||file.getName().endsWith(".XML")))   return null;
    StringBuffer content=new StringBuffer("代码    中文    序号--");
    SAXBuilder sb = new SAXBuilder();
    Document doc=null;
    try {
    doc = sb.build(file);
    Element root = doc.getRootElement();
    Element sourceEle = (Element)XPath.selectSingleNode(root, "/"+root.getName()+"/DataSources/DataSource/Data/Source");
      if (sourceEle==null) return null;
      String str=sourceEle.getText();
    //System.out.println(str);
      setProperty(str);   //分别给sheetName、fileName赋值
    //拿到/Data/Columns所用Column节点 
      List<Element> elementList=XPath.selectNodes(root, "/"+root.getName()+"/DataSources/DataSource/Data/Columns/Column");
      for (int i = 0; i < elementList.size(); i++) {
    //   System.out.println(elementList.get(i).getName());
    //   List<Element> childrenList=elementList.get(i).getChildren();
      if(elementList.get(i).getChildText("name").length()>4)
      content.append(elementList.get(i).getChildText("name").substring(4)).append("    ");
      content.append(elementList.get(i).getChildText("text")).append("    ");
      content.append(elementList.get(i).getChildText("sequence")).append("--");
       }
    } catch (JDOMException e) {
    System.out.println("读取XML文件出现JDOMException异常...........");
    e.printStackTrace();
    } catch (IOException e) {
    System.out.println("读取XML文件出现IOException异常.............");
    e.printStackTrace();
    }

    return String.valueOf(content);
    }
      

  4.   

    二楼的好像没有把xml节点和属性的名字保存下来吧。
    另外,我用的是dom4j我觉得我提出的是一个很普遍的需求吧,难道没有一个函数直接调用就行的?
      

  5.   


    <?xml version="1.0" encoding="GB2312"?>
    <root>
      <a>sdfs</a>
      <b><c>fsf</c></b>
    </root>  SAXReader reader = new SAXReader();
     Document    document = reader.read(new File("c:/xml/Dom4jSample2.xml"));
     Element root = document.getRootElement();  
     QName qname = new QName("b");
     Element e =root.element(qname);
     List<Element> list = root.elements(qname);
     System.out.println(e.asXML());这样行吗?
      

  6.   

    楼主把你的xml文件贴出来,想要哪些内容说明白点
      

  7.   

    比如源.xml是这样:
    <root>
      <a>sdfs</a>
      <b>
      <c>fsf</c>
      <d>aab<d>
      </b>
    </root>
    java程序只知道Node <b>的名字,不知道<b>以下的内容。要复制出新.xml
    <root>
      <b>
      <c>fsf</c>
      <d>aab<d>
      </b>
    </root>要能够无视<b>...</b>中的内容
      

  8.   

    是不要<b>...</b>以外的内容?
      

  9.   

    用XSLT,浏览器都带这个引擎的,写一个样式单配源文档就能得到结果文档了。
      

  10.   

    总的来说,
    我要写java程序,和别人的包合作处理数据。
    数据是以xml相互传递的。
    我要读入一个节点下的所有内容,
    处理这个节点的某些内容,忽视其它的数据结构,(这样接口才通用)但不能丢掉这些有用数据。
    最后把我处理的结果和源数据的有用部分写成xml
    传给下一个包。所以要有一个办法做到复制节点。
    就像用javascript中用函数newNode = Node.cloneNode(node,true)一样
      

  11.   

    其实6楼的方法已经可以按我想要的读出xml了,
    我再看看怎么写
      

  12.   

    a.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <root>
    <a>A</a>
    <b>
    <c>C</c>
    <d>D</d>
    </b>
    </root>import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    public class dom4jPractice1 {
    public static void main(String args[]){
    SAXReader sax=new SAXReader();
    try {
    Document doc=sax.read(new File("src/a.xml"));
    //取得b节点的元素
    Element b=doc.getRootElement().element("b");
    //获得b节点下的内容
    String str=b.asXML();
    //创建新的document对象
    Document newdoc=DocumentHelper.createDocument();
    Element  root=newdoc.addElement("root");
    //将b节点下的内容写入root节点下
    root.addText(str);
    //用输出流输出所创建的新的xml文件
    BufferedWriter bw=new BufferedWriter(new FileWriter(new File("src/a_new.xml")));
    bw.write(newdoc.asXML());
    bw.flush();
    bw.close();
    } catch (DocumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }catch(IOException e){
    e.printStackTrace();
    }
    }}
      

  13.   

    不是特别明白你的需求,不过我现在都不直接用dom4j读写xml了,而是用Xstream把JavaBean和xml互转,很方便。
      

  14.   

    按照6楼方法可以得到;按照基本的java api也可以:
    获取Node,再:public static String outputString(Node node) {
            TransformerFactory transFactory=TransformerFactory.newInstance();
            try {
             Transformer transformer = transFactory.newTransformer();
             StringWriter sw = new StringWriter(); 
             transformer.transform( new DOMSource(node), new StreamResult(sw)); 
             return sw.toString();
            } catch (TransformerConfigurationException e) {
                e.printStackTrace();
            } catch (TransformerException e) {
                e.printStackTrace();
            } return "";俺的难处在于,我只要内容,不要<?xml version="1.0" encoding="UTF-8"?><b> ...头。。只把内容放入另外一个xml中,难,太难,只取内容。现在还没找到办法,不想递归