JavaXML解析的四种⽅法(连载)
1. xml简介
XML:指可扩展标记语⾔, Extensible Markup Language;类似HTML。XML的设计宗旨是传输数据,⽽⾮显⽰数据。
⼀个xml⽂档实例:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <company name="Tencent" address="深圳市南⼭区">
3 <department deptNo="001" name="development">
4 <employee id="devHead" position="minister">许刚</employee>
5 <employee position="developer">⼯程师A</employee>
6 </department>
7 <department deptNo="002" name="education">
8 <employee position="minister" telephone="1234567">申林</employee>
9 <employee position="trainee">实习⽣A</employee>
10 </department>
11 </company>
第⼀⾏是 XML 声明。它定义 XML 的版本 (1.0) 和所使⽤的编码.
下⼀⾏描述⽂档的根元素:<company>开始,该根元素具有2个属性“name”,"address"。
最后⼀⾏定义根元素的结尾。</company>。
· XML ⽂档形成⼀种树结构
· XML ⽂档必须包含根元素。该元素是所有其他元素的⽗元素。
· XML ⽂档中的元素形成了⼀棵⽂档树。这棵树从根部开始,并扩展到树的最底端。
所有元素均可拥有⼦元素:
1 <root>
2
3 <child>
4
5 <subchild>.....</subchild>
6
7 </child>
8
9 </root>
⽗、⼦以及同胞等术语⽤于描述元素之间的关系。⽗元素拥有⼦元素。相同层级上的⼦元素成为同胞(兄弟或妹)。
1.1 节点
节点:XML⽂档中的所有节点组成了⼀个⽂档树(或节点树)。XML⽂档中的每个元素、属性、⽂本等都代表着树中的⼀个节点。树起始于⽂档节点,并由此继续伸出枝条,直到处于这棵树最低级别的所有⽂本节点为⽌,常⽤节点类型如下表所⽰:
节点类型附加说明实例
元素节点(Element)XML标记元素<company>…
</company>
属性节点(Attribute)XML标记元素的属性name=”Tencent”
⼯程师A
⽂本节点(Text)包括在XML标记中的⽂本
段
⽂档类型声明﹤!DOCTYPE…﹥
⽂档类型节点
xml标签大全(DocumentType)
<!—⽂档注释->
注释节点Comment XmlComment类注释节
点。
(1) 节点关系
通过上⾯的XML⽂档,我们构建出如下树状⽂档对象模型:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <bookstore>
3 <book category="COOKING">
4 <title lang="en">Everyday Italian</title>
5 <author>Giada De Laurentiis</author>
6 <year>2005</year>
7 <price>30.00</price>
8 </book>
9 <book category="CHILDREN">
10 <title lang="en">Harry Potter</title>
11 <author>J K. Rowling</author>
12 <year>2005</year>
13 <price>29.99</price>
14 </book>
15 <book category="WEB">
16 <title lang="en">Learning XML</title>
17 <author>Erik T. Ray</author>
18 <year>2003</year>
19 <price>39.95</price>
20 </book>
21 </bookstore>
再如上例xml⽂档:
例⼦中的根元素是 <bookstore>。⽂档中的所有 <book> 元素都被包含在 <bookstore> 中。<book> 元素有 4 个⼦元素:<title>、< author>、<year>、<price>。
(2)xml的特点
a). XML 的属性值须加引号。
· 与 HTML 类似,XML 也可拥有属性(名称/值的对)。
· 在 XML 中,XML 的属性值须加引号。
b). XML ⽂档必须有根元素.XML ⽂档必须有⼀个元素是所有其他元素的⽗元素。该元素称为根元素。
c). XML 标签对⼤⼩写敏感.
· XML 元素使⽤ XML 标签进⾏定义。
· XML 标签对⼤⼩写敏感。在 XML 中,标签 <Letter> 与标签 <letter> 是不同的。必须使⽤相同的⼤⼩写来编写打开标签和关闭标签。
d). XML 中的注释语法:
<!-- This is a comment -->
e). XML 元素 vs. 属性
1 <person sex="female">
2 <firstname>Anna</firstname>
3 <lastname>Smith</lastname>
4 </person>
5
6 <person>
7 <sex>female</sex>
8 <firstname>Anna</firstname>
9 <lastname>Smith</lastname>
10 </person>
在第⼀⾏中,sex 是⼀个属性。在第7⾏中,sex 则是⼀个⼦元素。两个例⼦均可提供相同的信息。
2. xml 解析
xml解析⽅法有四种:
· DOM(JAXP Crimson 解析器):W3C为HTML和XML分析器制定的标准接⼝规范,基于树,可随机动态访问和更新⽂档的内容、结构、样式。
· (simple API for XML):不是W3C的标准,⽽是由XML-DEV邮件列表成员于1998年为Java语⾔开发的⼀种基于事件的简单API。基于事件,逐⾏解析,顺序访问XML⽂档,速度快,处理功能简单。
· :鉴于DOM的低效率,⽽SAX⼜不能随机处理XML⽂档,Jason Hunter与Brett McLaughlin于2000年春天,开始创建⼀种能充分体现两者优势的——(Java-based DOM,基于Java的DOM),它是⼀个基于Java的对象模型,树状结构,能使读取、操作和写⼊XML⽂档,⽐DOM更⾼效,⽐SAX更强⼤,但由于使⽤了⼤量的类⽽不使⽤接⼝导致灵活性降低。
:DOM4J是⼀个易⽤的,开源的库,⽤于XML,XPath,XSLT。它应⽤于Java平台,采⽤了Java集合框架并完全⽀持DOM,SAX,JAXP。它提供了⼤量的接⼝,因此⽐JDOM更具有灵活性。
2.1 DOM解析xml
DOM(Document Object Model⽂档对象模型),是W3C为HTML和XML分析器制定的标准接⼝规范。
特点:独⽴于语⾔,跨平台(可以在各种编程和脚本语⾔中使⽤),需要将整个⽂档读⼊内存,在内存中创建⽂档树,可随即访问⽂档中的特定节点,对内存的要求⽐较⾼,经过测试,访问速度相对于其他解析⽅式较慢,适⽤于简单⽂档的随即处理。
常⽤的节点属性:
属性描述
nodeName结点名称
nodeValue结点内部值,通常只应⽤于⽂本结点
nodeType节点类型对应的数字
parentNode如果存在,指向当前结点的⽗亲结点
childNodes⼦结点列表
firstChild如果存在,指向当前元素的第⼀个⼦结点
firstChild如果存在,指向当前元素的第⼀个⼦结点
lastChild如果存在,指向当前元素的最后⼀个⼦结
点
previousSibling指向当前结点的前⼀个兄弟结点
nextSibling指向当前结点的后⼀个兄弟结点
attributes元素的属性列表
常⽤的节点⽅法:
操作类型⽅法原型描述
访问节点getElementById(id)根据ID属性查元素节点getElementsByName(name)根据name属性查元素集getElementsByTagName(tagName)根据元素标记名称查元素
集
创建节点createElement(tagName)创建元素节点createTestNode(string)创建⽂本节点createAttribute(name)创建属性节点
插⼊和添加节点appendChild(newChild)添加⼦节点到⽬标节点上insertBefore(newChild,targetChild)将newChild节点插⼊到
targetChild节点之前
复制节点CloneNode(bool)复制该节点,由bool确定是
否复制⼦节点
删除和替换节点removeChild(childName)删除由childName指定的节
点
replaceChild(newChild,oldChild)⽤newChild替换oldChild
属性节点操作getAttribute(name)返回⽬标对象指定属性名称
为name的属性值setAttribute(name,value)修改⽬标节点指定属性名称
为name的属性值为value removeAttribute(name)删除⽬标节点指定属性名称
为name的属性
(1)读取本地xml⽂档解析为对象的步骤:
* ⾸先利⽤DocumentBuilderFactory创建⼀个DocumentBuilderFactory实例;然后利⽤DocumentBuilderFactory创建DocumentBuilder //创建DocumentBuilderFactory⼯⼚实例。
DocumentBuilderFactory dbfactory = wInstance();
//通过⽂档创建⼯⼚创建⽂档创建器
DocumentBuilder dBuilder = wDocumentBuilder();
* 然后加载XML⽂档(Document) : 通过⽂档创建器DocumentBuilder的parse⽅法解析参数URL指定的XML⽂档,并返回⼀个Document 对象。
Document doc = dBuilder.parse(url);
* 然后获取⽂档的根结点(Element),
* 然后获取根结点中所有⼦节点的列表(NodeList),
* 然后使⽤再获取⼦节点列表中的需要读取的结点。
实例:第⼀种:Dom解析(读取,增,删,改)
在实际开发中多思考,灵活运⽤,⾮是难事⼉!,对于程序员来讲,精彩的代码是如何想出来的,远⽐看到精彩的代码更加令⼈期望!
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<books>
<book typeId="1">
<bookId>001</bookId>
<bookName>Maven实战</bookName>
<bookPrice>51</bookPrice>
<bookAuthor>陈晓斌</bookAuthor>
</book>
<book typeId="2">
<bookId>002</bookId>
<bookName>谈谈⽀付宝底层体系架构的⼤家</bookName>
<bookPrice>151</bookPrice>
<bookAuthor>程⽴</bookAuthor>
</book>
<book TypeId="3">
<bookId>003</bookId>
<bookName>预约死亡</bookName>
<bookPrice>99</bookPrice>
<bookAuthor>毕淑敏</bookAuthor>
</book>
<book TypeId="3">
<bookId>003</bookId>
<bookName>预约死亡</bookName>
<bookPrice>56</bookPrice>
<bookAuthor>毕淑敏</bookAuthor>
</book>
</books>
l.parsers.DocumentBuilder;
l.parsers.DocumentBuilderFactory;
l.parsers.ParserConfigurationException;
l.transform.Result;
l.transform.Source;
l.transform.Transformer;
l.transform.TransformerFactory;
l.transform.dom.DOMSource;
l.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class Test {
/**
* XML读取
* @throws Exception
*/
public static void xml() throws Exception{
//1.构建⼀个⼯⼚
DocumentBuilderFactory dbFactory =wInstance();
//2.构建builder1
DocumentBuilder dbBuilder = wDocumentBuilder();
//3.Document对象
//⼀般放相对路径就可以了,程序⾃动在项⽬下寻址
Document document = dbBuilder.parse("l");
/
/4.XML解析
NodeList list =ElementsByTagName("book");
for (int i = 0; i < Length(); i++) {
Element item = (Element)list.item(i);
String Attribute("typeId");
String ElementsByTagName("bookId").item(0).getTextContent();
String ElementsByTagName("bookName").item(0).getTextContent(); String ElementsByTagName("bookPrice").item(0).getTextContent(); String ElementsByTagName("bookAuthor").item(0).getTextContent(); System.out.println(bookId);
System.out.println(bookName);
System.out.println(bookPrice);
System.out.println(bookAuthor);
//System.out.println(attribute);
System.out.println("-----------------");
}
}
/**
* XML添加
* @throws Exception
*/
public static void insert() throws Exception{
//1.构建⼀个⼯⼚
DocumentBuilderFactory dbFactory =wInstance();
//2.构建builder1
DocumentBuilder dbBuilder = wDocumentBuilder();
//3.Document对象
Document document = dbBuilder.parse("l");
//1.伪造内存中的节点,游离节点
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论