一 HTML和JS简介
二 XML简介
1. 认识xml
<?xml version="1.0" encoding="UTF-8"?>
XML前导区 三个属性:
version 使用的xml版本 目前为1.0
encoding 页面的字符编码格式
standalone 此xml是否可以独立运行如果需要进行显示可以使用CSS或XSL进行控制
XML可以通过css以HTML格式进行输出,但xml主要用于存储数据,显示使用HTML更合适
使用CDATA标记使标记内内容进行原样输出,基本语法:
<![CDATA[ 原样输出内容 ]]>
2. ---------------------------------xml解析-----------------------------------------------
xml解析分为两种方式:DOM解析和SAX解析
xml文档---->xml分析器---->DOM或SAX接口---->xml应用程序
2.1 -----------------------------DOM解析-------------------------------------------------
基于DOM的分析器会将xml文件转换成一个DOM树,应用程序可以在任何时候访问文档中的任何数据
但由于将全部内容读取到内存中,这种解析方式较消耗内存,效率并不理想,不过与xml的思想吻合,有广泛的应用价值
DOM解析中有四个核心接口:
Document:此接口代表整个xml文档,通过Document节点可以访问xml中的所有元素内容
常用方法: public NodeList getElementsByTagName(String tagname) 取得指定节点的NodeList
public Element createElement(String tagname) throws DOMExecption 创建一个指定名称的节点
public Text createTextNode(String data) 创建一个文本内容节点
// Element createElement(String tagname) throws DOMExecption 创建一个节点元素
public Attr createAttribute(String name) throws DOMExecption 创建一个属性
Node:每一个Node 代表xml中的一个节点
常用方法: Node appendChild(Node newchild) throws DOMExecption 在当前节点下添加一个子节点
public NodeList getChildNodes() 取得本节点下的全部子节点
public Node getFirstChild() 取得本节点下的第一个节点
public Node getLastChild() 取得本节点下的最后一个节点
public boolean hasChildNodes() 是否还有其它节点
public boolean hasAttributes() 是否还有其它属性
String getNodeValue() throws DOMExecption 取得节点内容
NodeList: 表示一个节点的集合
常用方法:public int getLength() 取得节点长度
public Node item(int index) 根据索引取得节点对象
NamedNodeMap: 表示一组节点和其唯一名称的一一对应关系
如果需要进行DOM解析,需要按照如下步骤进行:
//建立DocumentBuilderFactory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//建立DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();
//建立Document
Document doc = builder.parse("web.xml");
//建立NodeList
NodeList nl = doc.getElementsByTagName("name");
//读取XML信息
String str = nl.item(0).getFirstChild().getNodeValue();
DOM解析中每个节点中的内容都是一个单独的文本节点,nl.item(0).getFirstChild().getNodeValue()所以采用这种方式
当NodeList nl = doc.getElementsByTagName("name"); nl有多个节点时,使用for循环进行循环输出
for (int i = 0;i<nl.getLength();i++){
String nodeValue = nl.item(i).getFirstChild().getNodeValue();
String nodeValue1 = nl1.item(i).getFirstChild().getNodeValue();
System.out.println(nodeValue+"--->"+nodeValue1);
}
生成XML文件并保存到磁盘需要使用TransformerFactory、Transformer、DOMSource和StreamResult四个类完成
TransformerFactory:用于获取一个Transformer 对象
常用方法: public static TransformerFactory newInstance()throws TransformerFactoryConfigurationError
获得一个新的TransformerFactory实例。 这个静态方法创建一个新的工厂实例。
public abstract Transformer newTransformer() throws TransformerConfigurationException
返回一个Transformer实例
Transformer: 用于完成内容的输出
public abstract void transform(Source xmlSource,Result outputTarget)throws TransformerException
将接受doc的DOMSource实例 xmlSource 输出
DOMSource: 主要用于接收Document对象
StreamResult: 指定要使用的输出流对象
常用方法: public StreamResult(File f) 指定输出的文件 构造方法
public StreamResult(OutputStream outputstream) 指定输出的输出流 构造方法
2.2. ----------------------------------------SAX解析----------------------------------------------
SAX采用顺序模式进行访问,快速读取xml数据,当SAX解析器扫描到文档开始与结尾,属性开始与结尾时都会调用相关方法。
常用方法: public void startDocument() throws SAXException 文档开始时执行
public void endDocument() throws SAXException 文档结束时执行
public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException 属性开始时执行
public void endElement(String uri,String localName,String qName) throws SAXException 属性结束时执行
public void characters(char[] ch,int start,int length) throws SAXException 元素内容
使用SAX解析XML文件首先需要自定义一个SAX解析器,实现DefaultHandler接口,并重写上面五个方法。
//自定义SAX解析器
class MySAX extends DefaultHandler {
@Override
public void startDocument() throws SAXException {
System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
}
@Override
public void endDocument() throws SAXException {
System.out.println("文档读取结束");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.print("<");
System.out.print(qName);
if (attributes != null){
for (int i = 0;i<attributes.getLength();i++){
System.out.print(" "+attributes.getQName(i)+"=\""+attributes.getValue(i)+"\"");
}
}
System.out.println(">");
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.print("</");
System.out.print(qName);
System.out.println(">");
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.println(new String(ch,start,length));
}
}
然后通过SAXParserFactory创建SAXParser,通过SAXParser实例对象调用parse方法完成解析输出
//创建SAXParserFactory
SAXParserFactory factory = SAXParserFactory.newInstance();
//创建SAXParser
SAXParser saxParser = factory.newSAXParser();
//输出
saxParser.parse(new File("F:\\IntelliJ\\WorkSpace\\WebDome_1\\Dome_1\\Hello1.xml"),new MySAX());
-----------------DOM解析和SAX解析的区别-----------------------
DOM SAX
操作 将整个文件读入内存形成DOM树,如果文件过大无法使用 顺序读入所需的文件内容,不会一次性读取,不受文件大小影响
访问权限 可以随意读取和修改文件的任意部分,没有次数限制 只能从头到尾解析一次,不支持五年间的随意修改
修改 可以任意修改文件树 只能读取XML文件内容,但不能修改
复杂度 易于理解,易于开发 开发比较复杂,需要用户自定义事件处理器
对象模型 系统自动建立DOM树,XML对象模型由系统提供 可以使用SAX自建事件处理器
DOM适合于修改,SAX适合于读取大型文件
3. --------------------------------------JDOM----------------------------------------------------------------
JDOM = DOM修改文件的有点 + SAX 快速读取的优点
JDOM提供了五个主要操作类:Document 定义了对XML的各种操作,可以使用提供的方法存取根元素及处理命令文件层次的相关信息
DOMBuilder 用来建立一个JDOM树
SAXBuilder 建立一个SAX解析
Element 定义元素的各种操作,可以获得元素属性,元素内容,子节点等
Attribute 定义了元素中的属性操作
XMLOutputter 将一个JDOM结构树格式化为一个XML文件并输出
JDOM进行XML文件输出
Element addresslist = new Element("addresslist");
Element linkman = new Element("linkman");
Element name = new Element("name");
Element email = new Element("email");
Attribute id = new Attribute("id","wt");
Document doc = new Document(addresslist);
name.setText("魏涛");
email.setText("123456");
name.setAttribute(id);
//不能使用setContent set会清除之前添加的节点
linkman.addContent(name);
linkman.addContent(email);
addresslist.addContent(linkman);
XMLOutputter out = new XMLOutputter();
out.setFormat(out.getFormat().setEncoding("UTF-8"));
try {
out.output(doc,new FileOutputStream("F:\\IntelliJ\\WorkSpace\\WebDome_1\\Dome_1\\Hello2.xml"));
} catch (IOException e) {
e.printStackTrace();
}
JDOM进行XML文件读取
SAXBuilder builder = new SAXBuilder();
Document doc = null;
try {
doc = builder.build("F:\\IntelliJ\\WorkSpace\\WebDome_1\\Dome_1\\Hello2.xml");
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Element stu = doc.getRootElement();
List list = stu.getChildren("linkman");
for( int i = 0;i<list.size();i++){
Element e = (Element) list.get(i);
String name = e.getChildText("name");
String id = e.getChild("name").getAttribute("id").getValue();
String email = e.getChildText("email");
System.out.println(name + id + email);
}
4. ---------------------------DOM4J----------------------------------------------------
主要接口:Attribute 定义了XML属性
Branch 为能够包含子节点的节点,如XML元素和文档,定义了一个公共的行为
CDATA 定义了XML CDATA区域
CharacterData 一个标识接口,标识基于字符的节点
Comment 定义了XML的注释
Document 定义了XML的文档
Element 定义了XML的元素
Text 定义了XML的文本节点
DOM4J进行XML文件输出
//创建文档
Document doc = DocumentHelper.createDocument();
//添加节点
Element addresslist = doc.addElement("addresslist");
Element linkman = addresslist.addElement("linkman");
Element name = linkman.addElement("name");
Element email = linkman.addElement("email");
//添加节点内容
name.setText("魏涛");
email.setText("123456");
//定义输出格式
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
//使用XMLWriter进行输出
XMLWriter writer = new XMLWriter(new FileOutputStream(new File("F:\\IntelliJ\\WorkSpace\\WebDome_1\\Dome_1\\Hello3.xml")),format);
writer.write(doc);
//资源关闭
writer.close();
DOM4J进行XML文件读入
//确定读入的文件
File file = new File("F:\\IntelliJ\\WorkSpace\\WebDome_1\\Dome_1\\Hello3.xml");
//建立SAX解析
SAXReader reader = new SAXReader();
//文件读入
Document doc = reader.read(file);
//获取根节点
Element rootElement = doc.getRootElement();
//获取根节点下所有节点
Iterator iterator = rootElement.elementIterator();
//迭代输出
while (iterator.hasNext()){
Element e = (Element) iterator.next();
System.out.println("name"+e.elementText("name"));
System.out.println("email"+e.elementText("email"));
}