JAVA 生成xml格式,具体格式如下,请问JAVA方法怎么写

Python010

JAVA 生成xml格式,具体格式如下,请问JAVA方法怎么写,第1张

import java.io.File

import java.io.FileNotFoundException

import java.io.FileOutputStream

import java.io.IOException

import org.w3c.dom.*

import org.xml.sax.SAXException

import javax.xml.parsers.*

import javax.xml.transform.*

import javax.xml.transform.dom.DOMSource

import javax.xml.transform.stream.*

import javax.xml.xpath.*

public class Test {

public static void main(String[] args) {

        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance()

        Element theBook=null, theElem=null, root=null

        try {

            factory.setIgnoringElementContentWhitespace(true)

            

            DocumentBuilder db=factory.newDocumentBuilder()

            Document xmldoc=db.parse(new File("Test1.xml"))

            root=xmldoc.getDocumentElement()

            

            theBook=(Element) selectSingleNode("/books/book[name='哈里波特']", root)

            System.out.println("--- 查询找《哈里波特》 ----")

            Element nameNode=(Element)theBook.getElementsByTagName("price").item(0) 

            String name=nameNode.getFirstChild().getNodeValue() 

            System.out.println(name)

            output(theBook)

            System.out.println("=============selectSingleNode(books/book[name='哈里波特'], root)==================")

            

            //--- 新建一本书开始 ----

            theBook=xmldoc.createElement("book")

            theElem=xmldoc.createElement("name")

            theElem.setTextContent("新书")

            theBook.appendChild(theElem)

            

            theElem=xmldoc.createElement("price")

            theElem.setTextContent("20")

            theBook.appendChild(theElem)

            theElem=xmldoc.createElement("memo")

            theElem.setTextContent("新书的更好看。")

            theBook.appendChild(theElem)

            root.appendChild(theBook)

            System.out.println("--- 新建一本书开始 ----")

            output(xmldoc)

            System.out.println("==============================")

            

            //--- 新建一本书完成 ----

            //--- 下面对《哈里波特》做一些修改。 ----

            //--- 查询找《哈里波特》----

           

            //--- 此时修改这本书的价格 -----

            theBook.getElementsByTagName("price").item(0).setTextContent("15")//getElementsByTagName返回的是NodeList,所以要跟上item(0)。另外,getElementsByTagName("price")相当于xpath的".//price"。

            System.out.println("--- 此时修改这本书的价格 ----")

            output(theBook)

            //--- 另外还想加一个属性id,值为B01 ----

            theBook.setAttribute("id", "B01")

            System.out.println("--- 另外还想加一个属性id,值为B01 ----")

            output(theBook)

            //--- 对《哈里波特》修改完成。 ----

            //--- 要用id属性删除《三国演义》这本书 ----

            theBook=(Element) selectSingleNode("/books/book[@id='B02']", root)

            System.out.println("--- 要用id属性删除《三国演义》这本书 ----")

            output(theBook)

            theBook.getParentNode().removeChild(theBook)

            System.out.println("--- 删除后的XML ----")

            output(xmldoc)

            //--- 再将所有价格低于10的书删除 ----

            NodeList someBooks=selectNodes("/books/book[price<10]", root)

            System.out.println("--- 再将所有价格低于10的书删除 ---")

            System.out.println("--- 符合条件的书有 "+someBooks.getLength()+"本。 ---")

            for(int i=0i<someBooks.getLength()i++) {

                someBooks.item(i).getParentNode().removeChild(someBooks.item(i))

            }

            output(xmldoc)

            saveXml("Test1_Edited.xml", xmldoc)

        } catch (ParserConfigurationException e) {

            e.printStackTrace()

        } catch (SAXException e) {

            e.printStackTrace()

        } catch (IOException e) {

            e.printStackTrace()

        }

    }

    public static void output(Node node) {//将node的XML字符串输出到控制台

        TransformerFactory transFactory=TransformerFactory.newInstance()

        try {

            Transformer transformer = transFactory.newTransformer()

            transformer.setOutputProperty("encoding", "gb2312")

            transformer.setOutputProperty("indent", "yes")

            DOMSource source=new DOMSource()

            source.setNode(node)

            StreamResult result=new StreamResult()

            result.setOutputStream(System.out)

            

            transformer.transform(source, result)

        } catch (TransformerConfigurationException e) {

            e.printStackTrace()

        } catch (TransformerException e) {

            e.printStackTrace()

        }   

    }

    

    public static Node selectSingleNode(String express, Object source) {//查找节点,并返回第一个符合条件节点

        Node result=null

        XPathFactory xpathFactory=XPathFactory.newInstance()

        XPath xpath=xpathFactory.newXPath()

        try {

            result=(Node) xpath.evaluate(express, source, XPathConstants.NODE)

        } catch (XPathExpressionException e) {

            e.printStackTrace()

        }

        

        return result

    }

    

    public static NodeList selectNodes(String express, Object source) {//查找节点,返回符合条件的节点集。

        NodeList result=null

        XPathFactory xpathFactory=XPathFactory.newInstance()

        XPath xpath=xpathFactory.newXPath()

        try {

            result=(NodeList) xpath.evaluate(express, source, XPathConstants.NODESET)

        } catch (XPathExpressionException e) {

            e.printStackTrace()

        }

        

        return result

    }

    

    public static void saveXml(String fileName, Document doc) {//将Document输出到文件

        TransformerFactory transFactory=TransformerFactory.newInstance()

        try {

            Transformer transformer = transFactory.newTransformer()

            transformer.setOutputProperty("indent", "yes")

            DOMSource source=new DOMSource()

            source.setNode(doc)

            StreamResult result=new StreamResult()

            result.setOutputStream(new FileOutputStream(fileName))

            

            transformer.transform(source, result)

        } catch (TransformerConfigurationException e) {

            e.printStackTrace()

        } catch (TransformerException e) {

            e.printStackTrace()

        } catch (FileNotFoundException e) {

            e.printStackTrace()

        }   

    }

}

 

XML:

<?xml version="1.0" encoding="GBK"?>

<books>

<book>

<name>哈里波特</name>

<price>10</price>

<memo>这是一本很好看的书。</memo>

</book>

<book id="B02">

<name>三国演义</name>

<price>10</price>

<memo>四大名著之一。</memo>

</book>

<book id="B03">

<name>水浒</name>

<price>6</price>

<memo>四大名著之一。</memo>

</book>

<book id="B04">

<name>红楼</name>

<price>5</price>

<memo>四大名著之一。</memo>

</book>

</books>

一般这种树形结构的,数据库表不应只有id、 parentId、 name ,最好是有一个字段描述该节点是什么节点,比如新加一列:leaf ,所有不是父节点的节点都是叶子节点,leaf列标识为1,其余父节点标为0,就简单多了

如果不能改表结构,你只有多查询一轮,你每次根据父节点去查子节点,查出子节点以后,还要拿子节点再去查,看看是否子节点下还有子节点,知道查询结果为空,标记javabean为叶子节点即可

至于如何生成xml 简单易用的 dom4j、jdom等 都是简单易用的

dom4j可以试试,不知道你的数据量有多大,如果太大的话,我没试过

xml文件是有规律的,你可以把要导出的数据构造一下,

我有个简单的代码

package com.test.xml

import java.io.FileWriter

import java.io.IOException

import java.io.Writer

import org.dom4j.Document

import org.dom4j.DocumentHelper

import org.dom4j.Element

import org.dom4j.io.OutputFormat

import org.dom4j.io.XMLWriter

public class Dom4JXML {

    

    public void createXML() {

        //用工厂类创建一个document实例

        Document doc = DocumentHelper.createDocument()

        //创建根元素emps

        Element rootEle = doc.addElement("emps")

        //添加注释

        rootEle.addComment("这是一个dom4j生成的xml文件")

        //emps根节点下创建一个emp节点

        Element empEle = rootEle.addElement("emp")

        //emp添加属性id="1"

        empEle.addAttribute("id", "1")

        //emp节点下创建一个name节点

        Element nameEle = empEle.addElement("name")

        //name节点下创建一个文本节点zhangsan

        nameEle.setText("zhangsan")

        //再为name节点创建一个兄弟节点

        Element sexEle = empEle.addElement("sex")

        sexEle.setText("man")

        //将document中的内容写入文件中

        try {

            Writer out = new FileWriter("F:\\emps.xml")

            //格式化输出,类型IE浏览一样

            OutputFormat format = OutputFormat.createPrettyPrint()

            //OutputFormat format = OutputFormat.createCompactFormat()

            format.setEncoding("UTF-8")

            //创建写出对象

            XMLWriter writer = new XMLWriter(out,format)

            writer.write(doc)

            writer.close()

            System.out.println("生成emps.xml成功。")

        } catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace()

            System.out.println("失败了。")

        }

    }

    

    public static void main(String[] args) {

        new Dom4JXML().createXML()

    }

}

然而从xml文件中解析以后的数据收集可以用SAX试试看

我这里有个简单的例子

package com.test.xml

import org.xml.sax.Attributes

import org.xml.sax.SAXException

import org.xml.sax.helpers.DefaultHandler

public class SAXParseHandler extends DefaultHandler{

public void startDocument()throws SAXException{

System.out.println("起始文挡")

}

public void endDocument()throws SAXException{

System.out.println("结束文挡")

}

public void characters(char[] ch,int start,int length)throws SAXException{

String charString=new String(ch,start,length)

System.out.println("字符:"+charString)

}

public void startElement(String namespaceURI,String localName,String qName,Attributes atts)throws SAXException{

System.out.println("起始元素:"+qName)

for(int i=0i<atts.getLength()i++){

System.out.println("属性值:"+atts.getValue(i))

}

}

public void endElement(String namespaceURI,String localName,String qName)throws SAXException{

System.out.println("结束元素:"+qName)

}

}

package com.test.xml

import javax.xml.parsers.SAXParser

import javax.xml.parsers.SAXParserFactory

public class Books {

/**

 * @param args

 */

public static void main(String[] args) throws Exception{

// TODO 自动生成方法存根

SAXParserFactory factory=SAXParserFactory.newInstance()

SAXParser parser=factory.newSAXParser()

parser.parse("booksamp.xml",new SAXParseHandler())

}

}