思路如下:
xml文件未知不明白什么意思?我索性就理解为一个目录下有很多xml文件,每个xml文件获取其中的bean节点属性。
1> 有xml文件路径,获取该路径下的所有文件,用后缀“xml”或“XML”过滤得到xml文件。
2> javaxxmlparsersDocumentBuilder builder = factorynewDocumentBuilder();
orgw3cdomDocument doc = builderparse(is); 创建文档对象。
3>docgetChildNodes()获取文档中所有的节点,循环遍历所得节点node,
通过nodegetAttributes()获取节点所有属性,获取各个属性name和值即可,输出想要得到的数据。
或者通过docgetElementsByTagName("bean");直接指定bean节点。然后用同样的方法获取属性名和值,输出。
以上是根据jdk的W3C库解析的。想方便可以通过dom4j、jdom进行文件 *** 作。思路变化不大。
XML文件的表现:以“xml”为文件扩展名的文件;
存储结构:树形结构;
节点名称区分大小写。
1、<book id="1"></book> id为属性, <book><id>1</id></book> id为节点
2、xml文件开头要加上版本信息和编码方式<xml version="10" encoding="UTF-8">
比如:
❤ 为什么要使用XML?
思考1:不同应用程序之间的通信?
思考2:不同平台间的通信?
思考3:不同平台间的数据共享?
答案就是我们要学习的XML文件。我们可以使用相同的xml把不同的文件联系起来
回到顶部
二、应用 DOM 方式解析 XML
❤ 在Java程序中如何获取XML文件的内容
解析的目的:获取节点名、节点值、属性名、属性值;
四种解析方式:DOM、SAX、DOM4J、JDOM
DOM、SAX :java 官方方式,不需要下载jar包
DOM4J、JDOM :第三方,需要网上下载jar包
示例:解析XML文件,目标是解析XML文件后,Java程序能够得到xml文件的所有数据
思考:如何在Java程序中保留xml数据的结构?
如何保留节点之间的层级关系?
注意常用的节点类型:
下面介绍DOM方式解析XML:
功能说明:
setEscapeText(false) 只是能改变 escapeElementEntities(String st) 中的参数,主要能改变文本里面如:
<root> aaaa>bbbb <root/> 中aaaa>bbbb的中的>不转变
对于Attribute 里面的特殊字符,我查了好久的原码发现人家里面是从
protected void writeEscapeAttributeEntities(String txt) throws IOException {
if (txt != null) {
String escapedText = escapeAttributeEntities(txt);
writerwrite(escapedText);
}
}//(在XMLWriter类中第1174行)
里面有个 escapeAttributeEntities(txt); 这个是专门用来转变Attribute 里面的特殊字符的,
所以要想解决这个问题,我是用了继承,写了一个
public class MyXMLWriter extends XMLWriter {
protected void writeEscapeAttributeEntities(String txt) throws IOException {
if (txt != null) {
//String escapedText = escapeAttributeEntities(txt);
writerwrite(txt);
}
}
}
直接注释了原码中的//StringescapedText=escapeAttributeEntities(txt);
就完美解决了。
import javaioFile;
import javaioFileOutputStream;
import javautilArrayList;
import javautilList;
import javautilScanner;
import orgdom4jDocument;
import orgdom4jDocumentHelper;
import orgdom4jElement;
import orgdom4jioOutputFormat;
import orgdom4jioSAXReader;
import orgdom4jioXMLWriter;
public class Book {
private int no;
private String name;
private double value;
public Book() {
}
public Book(int no, String name, double value) {
thisno = no;
thisname = name;
thisvalue = value;
}
public double getValue() {
return value;
}
public void setValue(double value) {
thisvalue = value;
}
public String getName() {
return name;
}
public void setName(String name) {
thisname = name;
}
public int getNo() {
return no;
}
public void setNo(int no) {
thisno = no;
}
}
class BookList {
private List<Book> bookList;
public BookList() {
bookList = readXML();
}
public long getCount() {
return bookListsize();
}
public List<Book> getBookList() {
return bookList;
}
public void setBookList(List<Book> bookList) {
thisbookList = bookList;
}
public void add(Book book) {
bookListadd(book);
}
public boolean delete(String name) {
Book book = query(name);
return bookListremove(book);
}
public void update(Book bookBefore, Book bookAfter) {
bookListremove(bookBefore);
add(bookAfter);
}
public Book query(String name) {
Book temp = null;
for (Book book : bookList) {
if (bookgetName()equals(name)) {
temp = book;
}
}
return temp;
}
public synchronized void writeXmlDocument(Book book) {
try {
File file = new File("D:\\bookxml");
Document document = null;
Element root = null;
if (!fileexists()) {
// 新建studentxml文件并新增内容
document = DocumentHelpercreateDocument();
root = documentaddElement("Books");//添加根节点
} else {
SAXReader saxReader = new SAXReader();
document = saxReaderread(file);
root = documentgetRootElement();//获得根节点
}
Element secondRoot = rootaddElement("Book");//二级节点
//为二级节点添加属性,属性值为对应属性的值
secondRootaddElement("no")setText(bookgetNo() + "");
secondRootaddElement("name")setText(bookgetName() + "");
secondRootaddElement("value")setText(bookgetValue() + "");
OutputFormat format = OutputFormatcreatePrettyPrint();
formatsetEncoding("GBK");
XMLWriter writer = new XMLWriter(new FileOutputStream("D:\\bookxml"), format);
writerwrite(document);
writerclose();
documentclearContent();
} catch (Exception e) {
eprintStackTrace();
}
}
public synchronized List<Book> readXML() {
List<Book> list = new ArrayList<Book>();//创建list集合
File file = null;
try {
file = new File("D:\\bookxml");//读取文件
if (fileexists()) {
SAXReader saxReader = new SAXReader();
Document document = saxReaderread(file);
List nodeList = documentselectNodes("Books/Book");
for (int i = 0; i < nodeListsize(); i++) {
Element el = (Element) nodeListget(i);
Book book = new Book();
booksetNo(IntegerparseInt(elelementText("no")));
booksetName(elelementText("name"));
booksetValue(DoubleparseDouble(elelementText("value")));
listadd(book);
}
}
} catch (Exception e) {
eprintStackTrace();
}
return list;
}
}
class Test {
public static void main(String args[]) {
BookList bl = new BookList();
boolean bBreak = true;
while (bBreak) {
Systemoutprintln("请输入 *** 作代码:");
Systemoutprintln("1:添加 2:删除 3:修改 4:查询 5:书籍统计 6:退出");
Scanner sc = new Scanner(Systemin);
int code = scnextInt();
if (code == 1) {
Systemoutprintln("请输入编号");
int no = scnextInt();
Systemoutprintln("请输入书名");
String name = scnext();
Systemoutprintln("请输入售价");
double value = scnextDouble();
Book book = new Book(no, name, value);
bladd(book);
blwriteXmlDocument(book);
} else if (code == 2) {
Systemoutprintln("请输入要删除的书籍名");
String name = scnext();
if (bldelete(name)) {
Systemoutprintln("删除成功");
} else {
Systemoutprintln("书籍不存在");
}
} else if (code == 3) {
Systemoutprintln("请输入要修改的书籍名");
String name = scnext();
Book bookBefore = blquery(name);
Systemoutprintln("请输入新的编号");
int newNo = scnextInt();
Systemoutprintln("请输入新的书名");
String newName = scnext();
Systemoutprintln("请输入新的售价");
double value = scnextDouble();
Book bookAfter = new Book(newNo, newName, value);
blupdate(bookBefore, bookAfter);
} else if (code == 4) {
Systemoutprintln("请输入要查询的书籍名");
String name = scnext();
Book book = blquery(name);
Systemoutprintln("编号:" + bookgetNo() + " 书名:" + bookgetName() + " 售价:" + bookgetValue());
} else if (code == 5) {
List<Book> list = blgetBookList();
Systemoutprintln("总书籍数:" + blgetCount());
for (Book book : list) {
Systemoutprintln("编号:" + bookgetNo() + " 书名:" + bookgetName() + " 售价:" + bookgetValue());
}
} else if (code == 6) {
bBreak = false;
}
}
}
}
jar 包 dom4jjar jaxen-114jar
后期主要是用来做配置文件的
<xml version="10" encoding="utf-8">
<students>
<student id="1">
<name>@@</name>
<age>56</age>
</student>
<student id="2">
<name>@@</name>
<age>56</age>
</student>
</students>
XML文件的后缀名为:xml
文档声明必须是第一行第一列
<xml version="10" encoding="UTF-8" standalone="yes”>version:该属性是必须存在的encoding:该属性不是必须的
打开当前xml文件的时候应该是使用什么字符编码表(一般取值都是UTF-8)
standalone: 该属性不是必须的,描述XML文件是否依赖其他的xml文件,取值为yes/no
必须存在一个根标签,有且只能有一个
XML文件中可以定义注释信息
XML文件中可以存在以下特殊字符
常见的解析工具
JAXP: SUN公司提供的一套XML的解析的API
JDOM: 开源组织提供了一套XML的解析的API-jdom
DOM4J: 开源组织提供了一套XML的解析的API-dom4j,全称:Dom For Java
pull: 主要应用在Android手机端解析XML
dom解析分为四步:1、document 2、element 3、attribute 4、text
什么是约束
用来限定xml文件中可使用的标签以及属性
DTD语法
定义元素
定义一个元素的格式为:<!ELEMENT 元素名 元素类型>简单元素:
EMPTY: 表示标签体为空
ANY: 表示标签体可以为空也可以不为空
PCDATA: 表示该元素的内容部分为字符串
复杂元素: 直接写子元素名称 多个子元素可以使用","或者"|"隔开; ","表示定义子元素的顺序 ; "|": 表示子元素只能出现任意一个 ""零次或一次, "+"一次或多次, ""零次或多次;如果不写则表示出现一次
<!ELMENT students (student))>
<!ELMENT student (naem,age))>
<!ELMENT name (#PCDATA))>
<!ELMENT age (#PCDATA))>
dtd定义属性
格式
定义一个属性的格式为:<!ATTLIST 元素名称 属性名称 属性的类型 属性的约束>属性的类型: CDATA类型:普通的字符串
属性的约束:
// #REQUIRED: 必须的 // #IMPLIED: 属性不是必需的 // #FIXED value:属性值是固定的
<!ATTLIST student id CDATA #EQUIRED>
schema语法,格式
1,创建一个文件,这个文件的后缀名为xsd。
2,定义文档声明
3,schema文件的根标签为: <schema>
4,在<schema>中定义属性: xmlns= >
由此可以这样理解Node和Element,Node是节点,一个属性、一段文字、一个注释等都是节点,而Element是元素,是比较完整的一个xml的元素,即我们口头上说的xml“结点”(此处故意使用“结”字,以示与“节点”Node区别),呵呵……
dom4j帮助文档在dom4j-161/docs/guidehtml文件里面,全部是英文,但是基本上应该能看懂。
1、 四种 *** 作xml的方式:SAX,DOM,JDOM,DOM4J
2、 DOM(Document Object Model):意思是把整个xml做为一个整体对象,直接全部放到内存里面,不管xml文件有多大;
3、 SAX=Sample API for XML:假如xml文件有2G,用第一种方式,是很困难的,SAX用的是一种类似流媒体方式进行的。
DOM和SAX是java的API,处理xml文件的时候,相对来说是比较困难的,于是出现了下面两种框架,包装了上面两个框架。
4、 JDOM:
5、 DOM4J:
6、 利用DOM4J解析xml文件(读取所有的属性节点)。
Document可以理解为整个文档对象
取root节点。DocumentgetRootElement()返回的是一个Element(元素)
7、 理解运用xpath,path就是路径,xpath在xml文件里面找到特定的节点。
DocumentselectNodes(“//hibernate-mapping/class/property”) //其中hibenate-mapping是根节点。做变orgdom4jNode对象返回的。
DocumentselectSingleNodes(“//hibernate-mapping/class/property”)//只拿第一个。
基中@name是property的属性名valueOf是拿出name的值;
需要加入DOM4J里面的jaxen包
8、 DOM4J的生成xml文件
9、 用FileWriter生成xml文件的时候,可能没有格式,可以用XMLWriter类,这样自动进行美化。
10、 DOM4J修改xml文件;很少用。
11、 自动生成代码往往用的是:freemarker或velocity,这是常用的。用dom4j生成也很少用。
12、 怎么用表里面的结构生成xml文件。
13、 JavaDB
a) Properties对象:可以理解为一个表格对应key,value
14、 Databasemetadata,可以能过这个JDK类,读取数据库的表结构,通过这个表结构做一些自己的事情。(熟悉用法)通过JDK文档和google学习
15、 元数据就是数据的数据,用来描述数据的数据。
16、 DWR,对Ajax框架封住得比较好,是类和java的结合。
以上就是关于java如何从一个xml文件读取根节点、子节点属性。全部的内容,包括:java如何从一个xml文件读取根节点、子节点属性。、如何用java程序从xml文件中根据文本内容获取指定标签并删除标签和内容、【求助】Dom4j 生成xml,节点增加属性时,属性值中有特殊字符,如何做到不转义等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)