JDOMResult out = new JDOMResult(); transformer.transform(new JDOMSource(in), out); Document doc2 = out.getDocument();
XMLOutputter out = new XMLOutputter(" ", true,"GB2312"); //直接设置缩进、是否换行、语言种类, out.setOmitDeclaration(true); //是否添加xml文件头,就是<?xml version=1.0?> out.setTextNormalize(true); out.output(doc2, new java.io.OutputStreamWriter(System.out));JDOM还提供了一些去除文本中的空格之类的方法,都是由一个方法即直接完成。
谢谢!
import javax.xml.parsers.*;
import org.w3c.dom.*; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc=builder.parse("table.xml");
doc.normalize(); NodeList cols =doc.getElementsByTagName("col");
Element colel;
//get name
doc.getElementsByTagName("name").item(0).getFirstChild().getNodeValue();
//get descript
doc.getElementsByTagName("descript").item(0).getFirstChild().getNodeValue(); //get col
for (int i=0;i<cols.getLength();i++){
colel=(Element)cols.item(i);
//get name type descript
colel.getElementsByTagName("name").item(0).getFirstChild().getNodeValue();
}
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<publish_date>
<year>2000</year>
<month>10</month>
<day>1</day>
</publish_date>
<description>An in-depth look at creating applications with XML.</description>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<publish_date>
<year>2000</year>
<month>12</month>
<day>16</day>
</publish_date>
<description>A former architect battles corporate zombies.</description>
</book>
<book id="bk103">
<author>Corets, Eva</author>
<title>Maeve Ascendant</title>
<publish_date>
<year>2000</year>
<month>11</month>
<day>17</day>
</publish_date>
<description>After the collapse of a nanotechnology society in England.</description>
</book>
</catalog>使用DOM解析 --BookParser.javaimport javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;/**
*使用DOM提取XML内容的例子
*/
class BookParser{
public static void main(String[] args){
try{
//获取一个XML解析器
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
//解析XML文件
Document document=builder.parse(new File("books.xml"));
//去掉XML文档中空白部分
document.normalize();
//获取根节点并打印根节点的名称
Element root=document.getDocumentElement();
System.out.println("根原始的名称:"+root.getTagName());
//获取所有的"book"标记,它是一个NodeList对象
NodeList books=root.getElementsByTagName("book");
//遍历NodeList
System.out.println("书本列表");
for(int i=0;i<books.getLength();i++){
//获取books中的每一个元素
Element book=(Element)books.item(i);
//获取每个"book"标记的"id"属性
String book_id=book.getAttribute("id");//或book.getAttributeNode("id").getValue();
System.out.println("序号:"+book_id);
//获取"book"标记下的每个元素
System.out.print("作者:");
System.out.println(book.getElementsByTagName("author").item(0).getFirstChild().getNodeValue());
System.out.print("标题:");
System.out.println(book.getElementsByTagName("title").item(0).getFirstChild().getNodeValue());
//获取"publish_date"元素
Element publishDate=(Element)book.getElementsByTagName("publish_date").item(0);
//获取"publish_date"元素下的每个子元素
String year=publishDate.getElementsByTagName("year").item(0).getFirstChild().getNodeValue();
String month=publishDate.getElementsByTagName("month").item(0).getFirstChild().getNodeValue();
String day=publishDate.getElementsByTagName("day").item(0).getFirstChild().getNodeValue();
System.out.println("出版日期:"+year+"年"+month+"月"+day+"日");
System.out.print("描述:");
System.out.println(book.getElementsByTagName("description").item(0).getFirstChild().getNodeValue());
System.out.println("--------------------");
}
}
catch(Exception e2){}
}
}
http://www.jdom.org/dist/binary/jdom-b8.zip
这是目前最常用的xml解析包,解压后,把build/jdom.jar添入classpath即可
压缩包里还有samples,可以参阅。以下是针对你的xml文件的解析例子:import java.io.*;
import java.util.*;import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;
import org.jdom.transform.*;public class TestXML extends Thread{
public static void main(String []args){ try{
SAXBuilder sb=new SAXBuilder();
FileReader fr=new FileReader("F:\\on.xml");
//假设这on.xml是你的文件
Document doc=sb.build(fr);
fr.close();
Element e=doc.getRootElement();
System.out.println("Root Element: "+e.getName());
System.out.println("----------------------");
e.getChild("name").setText("Hello World!");
e.getChild("descript").setText("改动此处的文本");
java.util.List list=e.getChild("cols").getChildren("col");
for(int i=0;i<list.size();i++){
Element col=(Element)list.get(i);
System.out.println(col.getChild("descript").getText());
}
System.out.println("----------------------");
XMLOutputter out=new XMLOutputter();
out.output(doc,new java.io.OutputStreamWriter(System.out));
/*此处的output(Document document,java.io.Writer writer);
*你可以把writer定为任何一种输出,比如FileWriter,
*可以把结果输出到一个文件中
*/
}catch(Exception e){} }
}
与前两者比较jdom更让java程序员得心应手,因为它是针对java语言设计的,而且具用DOM与SAX两者的优点,速度快了许多:)
useinfo.xml
-------------------------------------------------------------------------------
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE table SYSTEM "useinfo.dtd">
<table>
<name>useinfo</name>
<descript>用户信息表表的名字</descript>
<cols>
<col>
<name>id</name>
<type>number</type>
<descript>用户编号</descript>
</col>
<col>
<name>name</name>
<type>varchar2(50)</type>
<descript>姓名</descript>
</col>
<col>
<name>password</name>
<type>varchar2(50)</type>
<descript>密码</descript>
</col>
</cols>
</table>
-------------------------------------------------------------------------------
useinfo.dtd:
-------------------------------------------------------------------------------
<?xml version="1.0" encoding="GB2312" ?>
<!ELEMENT col ( name, type, descript ) ><!ELEMENT name ( #PCDATA ) ><!ELEMENT type ( #PCDATA ) ><!ELEMENT table ( name, descript, cols ) ><!ELEMENT cols ( col+ ) ><!ELEMENT descript ( #PCDATA ) >
-------------------------------------------------------------------------------
useinfo.map:
-------------------------------------------------------------------------------
<?xml version='1.0' ?>
<!DOCTYPE XMLToDBMS SYSTEM "xmldbms.dtd" ><XMLToDBMS Version="1.0">
<Options>
</Options>
<Maps>
<ClassMap>
<ElementType Name="col"/>
<ToClassTable>
<Table Name="col"/>
</ToClassTable>
<PropertyMap>
<ElementType Name="name"/>
<ToColumn>
<Column Name="name"/>
</ToColumn>
<OrderColumn Name="nameOrder" Generate="Yes"/>
</PropertyMap>
<PropertyMap>
<ElementType Name="type"/>
<ToColumn>
<Column Name="type"/>
</ToColumn>
<OrderColumn Name="typeOrder" Generate="Yes"/>
</PropertyMap>
<PropertyMap>
<ElementType Name="descript"/>
<ToColumn>
<Column Name="descript"/>
</ToColumn>
<OrderColumn Name="descriptOrder" Generate="Yes"/>
</PropertyMap>
</ClassMap>
<ClassMap>
<ElementType Name="table"/>
<ToRootTable>
<Table Name="table"/>
<CandidateKey Generate="Yes">
<Column Name="tablePK"/>
</CandidateKey>
<OrderColumn Name="tableOrder" Generate="Yes"/>
</ToRootTable>
<PropertyMap>
<ElementType Name="name"/>
<ToColumn>
<Column Name="name"/>
</ToColumn>
<OrderColumn Name="nameOrder" Generate="Yes"/>
</PropertyMap>
<PropertyMap>
<ElementType Name="descript"/>
<ToColumn>
<Column Name="descript"/>
</ToColumn>
<OrderColumn Name="descriptOrder" Generate="Yes"/>
</PropertyMap>
<RelatedClass KeyInParentTable="Candidate">
<ElementType Name="cols"/>
<CandidateKey Generate="Yes">
<Column Name="tablePK"/>
</CandidateKey>
<ForeignKey>
<Column Name="tableFK"/>
</ForeignKey>
<OrderColumn Name="colsOrder" Generate="Yes"/>
</RelatedClass>
</ClassMap>
<ClassMap>
<ElementType Name="cols"/>
<ToClassTable>
<Table Name="cols"/>
</ToClassTable>
<RelatedClass KeyInParentTable="Candidate">
<ElementType Name="col"/>
<CandidateKey Generate="Yes">
<Column Name="colsPK"/>
</CandidateKey>
<ForeignKey>
<Column Name="colsFK"/>
</ForeignKey>
<OrderColumn Name="colOrder" Generate="Yes"/>
</RelatedClass>
</ClassMap>
</Maps>
</XMLToDBMS>
-------------------------------------------------------------------------------
useinfo.
-------------------------------------------------------------------------------
CREATE TABLE "col" ("colOrder" INTEGER, "typeOrder" INTEGER, "colsFK" INTEGER, "name" VARCHAR(255), "nameOrder" INTEGER, "descriptOrder" INTEGER, "type" VARCHAR(255), "descript" VARCHAR(255));
CREATE TABLE "table" ("tablePK" INTEGER, "name" VARCHAR(255), "nameOrder" INTEGER, "descriptOrder" INTEGER, "tableOrder" INTEGER, "descript" VARCHAR(255));
CREATE TABLE "cols" ("colsOrder" INTEGER, "colsPK" INTEGER, "tableFK" INTEGER);
CREATE TABLE XMLDBMSKey (HighKey Integer);
INSERT INTO XMLDBMSKey VALUES (0);
-------------------------------------------------------------------------------
接分!
muskteeeer(跳蚤):
您这种方法较好,具体怎样执行呢,在什么环境下执行useinfo.map、useinfo.dtd,我是
刚学这部分,希望得到您和大家的帮助,等您回音!
具体一点,我的信箱是:[email protected]
我是不是很笨很烦!!
您好,能否具体告诉我,我刚接触到xml,用XSLT怎样转换,再什么环境下执行,在???
等您回答!
谢谢!
如果可以揭贴,给大家加分!!
谢谢!
具体一点·!
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
CREATE TABLE "<xsl:value-of select="//table/name"/>" (
<xsl:apply-templates select="//cols/col"/>
);
</xsl:template>
<xsl:template match="cols/col">
"<xsl:value-of select="name"/> " <xsl:value-of select="type"/>;
</xsl:template>
</xsl:stylesheet>
StreamSource xmlSource = new StreamSource(new File("table.xml"));
StreamSource xslSource = new StreamSource(new File("table.xsl"));
//输出流
ByteArrayOutputStream out = new ByteArrayOutputStream();
StreamResult outResult = new StreamResult(out);
//转换
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer(xslSource);
transformer.transform(xmlSource, outResult);
System.out.println(out.toByteArray());
您可否具体一点,我试了一下不幸,老是提示“StreamSource、TransformerFactory等类找不到”
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import javax.xml.transform.*;不过我是不喜欢用DOM,它的速度太慢,象上面那样的程序,运行一次大概要用1秒(是在1.7G处理器、384M内存下使用DOM2),在java环境里DOM不太实用,不能用于操作频繁的作业。还有就是同样的处理,在JDOM中更简单:
Transformer transformer = TransformerFactory.newInstance()
.newTransformer(new StreamSource(stylesheet));
//stylesheet是xsl文件,比如:"F:\\myxslfile.xsl"
JDOMResult out = new JDOMResult();
transformer.transform(new JDOMSource(in), out);
Document doc2 = out.getDocument();
XMLOutputter out = new XMLOutputter(" ", true,"GB2312");
//直接设置缩进、是否换行、语言种类,
out.setOmitDeclaration(true);
//是否添加xml文件头,就是<?xml version=1.0?>
out.setTextNormalize(true);
out.output(doc2, new java.io.OutputStreamWriter(System.out));JDOM还提供了一些去除文本中的空格之类的方法,都是由一个方法即直接完成。
我想不知大家能否给个具体的例子?!
可以把xml文件生成一个sql语句。
比如:creat table userinfo(id number(4), ........);
再次谢谢大家的帮助和关注!
等大家的回音!
muskteeeer(跳蚤):
您这种方法较好,具体怎样执行呢,在什么环境下执行useinfo.map、useinfo.dtd,我是
刚学这部分,希望得到您和大家的帮助,等您回音!
用你的代码:
Transformer transformer = TransformerFactory.newInstance()
.newTransformer(new StreamSource(stylesheet));
//stylesheet是xsl文件,比如:"F:\\myxslfile.xsl"
JDOMResult out = new JDOMResult();
transformer.transform(new JDOMSource(in), out);
Document doc2 = out.getDocument();
XMLOutputter out = new XMLOutputter(" ", true,"GB2312");
//直接设置缩进、是否换行、语言种类,
out.setOmitDeclaration(true);
//是否添加xml文件头,就是<?xml version=1.0?>
out.setTextNormalize(true);
out.output(doc2, new java.io.OutputStreamWriter(System.out));
结果doc2不能输出任何东西?是怎么回事?
我想知道你预计输出的是不是一个CREAT TABLE的SQL语句?
muskteeeer(跳蚤):
您这种方法较好,具体怎样执行呢,在什么环境下执行useinfo.map、useinfo.dtd,我是
刚学这部分,希望得到您和大家的帮助,等您回音!
muskteeeer(跳蚤):
您这种方法较好,具体怎样执行呢,在什么环境下执行useinfo.map、useinfo.dtd,我是
刚学这部分,希望得到您和大家的帮助,等您回音!
我的邮箱[email protected]
如果可以马上揭贴!
谢谢各位的帮助!