MSXML解析XML文档
- 格式:doc
- 大小:97.50 KB
- 文档页数:21
一、介绍及优缺点分析1. DOM(Document Object Model)DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。
DOM是以层次结构组织的节点或信息片断的集合。
这个层次结构允许开发人员在树中寻找特定信息。
分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。
由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。
【优点】①允许应用程序对数据和结构做出更改。
②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。
【缺点】①通常需要加载整个XML文档来构造层次结构,消耗资源大。
2. SAX(Simple API for XML)SAX处理的优点非常类似于流媒体的优点。
分析能够立即开始,而不是等待所有的数据被处理。
而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。
这对于大型文档来说是个巨大的优点。
事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。
一般来说,SAX还比它的替代者DOM快许多。
选择DOM还是选择SAX?对于需要自己编写代码来处理XML文档的开发人员来说,选择DOM还是SAX解析模型是一个非常重要的设计决策。
DOM采用建立树形结构的方式访问XML文档,而SAX采用的是事件模型。
DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。
用DOM 解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。
可以很容易的添加和修改树中的元素。
然而由于使用DOM 解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。
由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。
SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。
XML4种解析方法一、重要源码说明(1)DOM//创建解析工厂DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();//指定DocumentBuilderDocumentBuilder builder = dbfactory.newDocumentBuilder()//从文件构造一个Document,因为XML文件中已经指定了编码,所以这里不必了Documentdoc=builder.parse(domparse.class.getClassLoader().getResourceAsStream("person.xml")); //获取根节点Element root = doc.getDocumentElement();System.out.println("根节点标记名:" + root.getTagName());//遍历节点NodeList list = root.getChildNodes();for (int i = 1; i < list.getLength(); i=i+2) {Node d = list.item(i);NodeList plist = d.getChildNodes();System.out.println("--"+d.getNodeName());NamedNodeMap nnm = d.getAttributes();for (int j = 0; j<nnm.getLength(); j++) {System.out.println("----"+nnm.item(j).getNodeName()+":"+nnm.item(j).getNodeV alue());}for(int k=1;k<plist.getLength();k=k+2){System.out.println("----"+plist.item(k).getNodeName()+":"+plist.item(k).getTextContent());}}(2)SAX首先创建解析器类继承DefaultHandler在解析器类中重写一些4个方法//文档开始初始化两个容器@Overridepublic void startDocument() throws SAXException {tagName = new V ector<String>();tagV alue = new V ector<String>();}//遇到标签将标签加入标签容器,并将标签的属性打印出来@Overridepublic void startElement(String uri, String localName, String name,Attributes attributes) throws SAXException {tagName.add(name);for (int i = 0; i < attributes.getLength(); i++) {System.out.println("属性名称: "+attributes.getQName(i));System.out.println("属性的值: "+attributes.getV alue(attributes.getQName(i)));}}//遇到文字类容将其添加到相应的字符串容器@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {if(tagName.size()-1==tagV alue.size()){tagV alue.add(new String(ch,start,length));}}//文档结束,将两个容器的值读取出来,完成遍历@Overridepublic void endDocument() throws SAXException {for(int i=0;i<tagName.size();i++){String tagString = tagName.get(i);if(tagString.equals("")||tagString!=null){System.out.println("节点名称:"+tagString);System.out.println("节点的值:"+tagV alue.get(i));}}}用SAXParser加载解析器类SAXParser saxParser = spf.newSAXParser();saxParser.parse(new File(filename), new PersonXMLHandler());(3)JOMSAXBuilder builder=new SAXBuilder(false);Document doc=builder.build(xmlpath);//内存加载XMLElement root=doc.getRootElement();//读取根节点//以递归的方式遍历XMLpublic void parse(Element root){System.out.println("节点名称:"+root.getName());String value = root.getText().trim();System.out.println("节点的值:"+root.getText());List AttrList = root.getAttributes();for (int i = 0; i < AttrList.size(); i++) {Attribute attr = (Attribute)AttrList.get(i);System.out.println("属性名称:"+attr.getName());System.out.println("属性的值:"+attr.getV alue());}List list=root.getChildren();for (Iterator iter =list.iterator(); iter.hasNext();) {Element element = (Element)iter.next();parse(element);}(4)DOM4J//内存加载XML文档SAXReader reader = new SAXReader();Document document = reader.read(new File(fileName));//以递归的方式完成遍历public void treeWalk(Element element) {System.out.println("节点名称:"+element.getName());System.out.println("节点的值:"+element.getText());for ( Iterator<Attribute> i = element.attributeIterator(); i.hasNext(); ) {Attribute attribute = (Attribute) i.next();System.out.println("属性名称:"+attribute.getName());System.out.println("属性的值:"+attribute.getText());}for (int i = 0, size = element.nodeCount(); i < size; i++) {Node node = element.node(i);if (node instanceof Element) {treeWalk((Element) node);}}二、部署与测试说明将工程导入myEclipse或eclipse等开发工具,运行test.java主程序(java application)。
解析Xml⽂件的三种⽅式1、Sax解析(simple api for xml) 使⽤流式处理的⽅式,它并不记录所读内容的相关信息。
它是⼀种以事件为驱动的XML API,解析速度快,占⽤内存少。
使⽤回调函数来实现。
1class MyDefaultHander extends DefaultHandler{2private List<Student> list;3private Student student;45 @Override6public void startDocument() throws SAXException {7super.startDocument();8 list=new ArrayList<>();9 }1011 @Override12public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {13super.startElement(uri, localName, qName, attributes);14if(qName.equals("student")){15 student=new Student();1617 }18 preTag=qName;19 }2021 @Override22public void endElement(String uri, String localName, String qName) throws SAXException {23if(qName.equals("student")){24 list.add(student);25 }26 preTag=null;27 }2829 @Override30public void characters(char[] ch, int start, int length) throws SAXException {31if(preTag!=null){32if(preTag.equals("id")){33 student.setId(Integer.parseInt(new String(ch,start,length)));34 }else if(preTag.equals("name")){35 student.setName(new String(ch,start,length));36 }else if(preTag.equals("age")){37 student.setAge(Integer.parseInt(new String(ch,start,length)));38 }39 }40 }41public List<Student> getStudents(){42return list;43 }44 }45public List<Student> sax_parser(){46 List<Student> list=null;47try {48 SAXParser parser= SAXParserFactory.newInstance().newSAXParser();49 InputStream is= getAssets().open("student.xml");50 MyDefaultHander hander=new MyDefaultHander();51 parser.parse(is,hander);52 list= hander.getStudents();53 } catch (ParserConfigurationException e) {54 e.printStackTrace();55 } catch (SAXException e) {56 e.printStackTrace();57 } catch (IOException e) {58 e.printStackTrace();59 }60return list;61 }2、Dom解析 DOM(Document Object Model) 是⼀种⽤于XML⽂档的对象模型,可⽤于直接访问XML⽂档的各个部分。
利用 XMLPullParser 进行XML 数据解析和处理使用XMLPullParser进行XML数据解析和处理XMLPullParser是一种在Android平台上常用的用于解析和处理XML数据的工具。
它具有快速、高效的特点,能够准确地解析XML 文档,并提供了灵活的API来处理解析结果。
本文将介绍如何利用XMLPullParser进行XML数据解析和处理。
一、XML数据解析的概念和原理XML数据解析是指将XML文档中的数据提取出来并进行处理的过程。
XML文档是一种标记语言,用于描述结构化的数据。
XML数据解析的过程可以分为以下几个步骤:1. 创建XMLPullParser对象:首先,需要创建一个XMLPullParser 对象,用于解析XML文档。
2. 设置输入源:在进行XML数据解析之前,需要设置XMLPullParser的输入源。
输入源可以是一个文件、一个输入流或者一个URL。
3. 解析XML文档:通过调用XMLPullParser对象的相应方法,可以逐行解析XML文档,获取XML文档中的节点信息和数据。
4. 处理解析结果:根据XML数据的结构和需要,可以使用条件语句、循环结构等方式对解析结果进行处理,提取所需的数据,并进行后续的操作。
二、利用XMLPullParser进行XML数据解析的步骤下面逐步介绍如何使用XMLPullParser进行XML数据解析和处理的具体步骤。
步骤1:导入相关的类和包在使用XMLPullParser进行XML数据解析之前,需要导入相应的类和包。
具体的导入语句如下:import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;import org.xmlpull.v1.XmlPullParserFactory;import java.io.InputStream;步骤2:创建XMLPullParser对象需要通过XmlPullParserFactory类的newInstance()方法创建XmlPullParserFactory对象,并通过XmlPullParserFactory对象的newPullParser()方法创建XMLPullParser对象,示例代码如下:XmlPullParserFactory factory = XmlPullParserFactory.newInstance();XmlPullParser parser = factory.newPullParser();步骤3:设置输入源设置XMLPullParser对象的输入源,可以是一个输入流、一个文件或者一个URL。
常用的解析XML的方式分为两种,它们基于不同的API:1.Tree-based API:这种API的处理方式是将XML的结构看成是树,然后把树的各部分看成一个对象来处理,这就是我们说的DOM (Document Object Model)方式。
在iPhone的SDK里包含了一个libxml2的框架(Framework)就能进行DOM解析方式。
Google的GDataXML 也是基于libxml2的,因此在使用GDataXML之前,你需要先导入libxml2。
2.Event-driven API:这种方式通常用于解析基于的事件,SAX解析方式就是这种解析方式的代表。
在iPhone开发的,也可以利用这种方式来解析XML,不过这可不是Iphone SDK 的属性啊,而是Objective-C的功能。
在Objectvie-C种有专门解析XML的类NSXMLParser。
NSXMLParser和CGataXML的使用方法:NSXMLParser解析方式NSXMLParser解析XML的主要工作都是靠它的代理(NSXMLParserDelegate)来实现的。
- (void)viewDidLoad {[super viewDidLoad];//........NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:@"/xxx/xxx.xml"]];[parser setDelegate:self];[parser parse];for (int i = 0; i < [newsArray count]; i++) {NSLog(@"%@",[newsArray objectAtIndex:i]);}}就这么几句,就开始解析了,怎样得到XML里面的数据呢?那就去代理里面找吧!#pragma mark NSMXLParser Delegate Methods- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementNamenamespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{if ([elementName isEqualToString:@"docTitle"]) {if (!newsArray) {newsArray = [[NSMutableArray alloc] init];return;}}}- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ if (!currentString) {currentString = [[NSMutableString alloc] init];}[currentString appendString:string];[currentString setString:[currentStringstringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];}- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{if ([elementName isEqualToString:@"docTitle"]) {[newsArray addObject:currentString];}[currentString release];currentString = nil;}先说一下程序运行的流程,当parser初始化并执行parse语句时([parser parse]),程序会跳到代理方法里面走第一个代理方法。
∙VC++中利用MSXML解析XML文档∙作者:未知来源:网络日期:2007-3-22 21:55:45∙一、XML 简介XML(Xtensible Markup Language,即扩展标记语言)的发展起源于1996年。
当时,出版界巨头和Web 业内人士经过共同讨论,提出了创建SGML(Standard Generalized Markup Language,即标准通用标识语言)子集(HML)的建议。
该子集专用于Web,具有可扩展(或可扩充)性,并且能利用结构化标记语言的所有高级功能,但摒弃了SGML的复杂性。
XML规范的第一份草稿于1996年11月发布后不久,1997年1月首个XML解析器就面世了。
随后,便出现了XML的应用以及新的规范和解析器。
HTML(Hypertext Markup Language)语言是大家所熟悉的开发网页的一种标记语言,但它不是一种编程语言,它的主要标记是针对文档内容本身结构的描述,因机器本身是不能够解析它的内容的。
XML语言是SGML语言的子集,它保留了SGML主要的使用功能,同时大大减小了SGML的复杂性。
它不仅能表示文档的内容,而且可以表示文档的结构,这样在能够被人类理解的同时,也能够被机器所理解。
虽然HTML 是SGML的一个应用,XML是SGML的一个子集,但是XML绝不是在HTML上添加某些元素而形成的,它们之间是有很大区别的。
最大的区别就是XML允许使用者为某种特殊目的而定义自已的元素。
除此之外,另一个最主要的区别就是XML致力解决的问题,正是在使用HTML时所遇到的一些特殊问题。
XML要求遵循一定的严格标准,其分析程序比HTML浏览器对语法和结构的要求更加严格。
XML文档每次分析的结果都一致,而HTML在不同的浏览器中可能会作出不同的分析和显示。
同时,XML标准是对数据的处理应用,而不只是针对Web页的,它还可涉及到数据库电子商务系统,以及任何显示系统的高级应用。
xml⽂件的解析过程详解XML项⽬⼯程展⽰图如下图:student.xml ⽂件展⽰:<?xml version="1.0" encoding="utf-8" ?><person><student id='1'><name>余超</name><sex>男</sex><desc>⼀个执着⽽⼜天真的孩⼦</desc></student><student id='2'><name>马靖</name><sex>⼥</sex><desc>⼀个特别难追求的⼥孩⼦</desc></student></person>Student实体类的展⽰:其作⽤就是⽤于临时保存xml⽂件中的数据到属性中package net.nyist.xmlparse.domain;import java.io.Serializable;/*** @author yuchao** @school 南阳理⼯软件学院移动设备应⽤与开发移动四班** @email yu0312chao@** @time 2014年9⽉30⽇下午10:52:47*/@SuppressWarnings("serial")public class Student implements Serializable {private int id;private String name;private String sex;private String desc;public Student() {}public Student(int id, String name, String sex, String desc) {this.id = id; = name;this.sex = sex;this.desc = desc;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}@Overridepublic String toString() {return"Student [id=" + id + ", name=" + name + ", sex=" + sex+ ", desc=" + desc + "]";}}⽅法⼀:通过DOM来解析XML⽂件 package net.nyist.xmlparse.parse.domimport java.io.InputStream;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import net.nyist.xmlparse.domain.Student;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;/*** @author yuchao** @school 南阳理⼯软件学院移动设备应⽤与开发移动四班** @email yu0312chao@** @time 2014年9⽉30⽇下午11:12:57*/public class DocumentBuilderFactoryDemo {public static void main(String[] args) {long start = System.currentTimeMillis();/** ⾸先得到:得到 DOM 解析器的⼯⼚实例 */DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();List<Student> students = new ArrayList<Student>();try {/** 然后从 DOM ⼯⼚获得 DOM 解析器 */DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();InputStream is = DocumentBuilderFactoryDemo.class.getClassLoader().getResourceAsStream("student.xml");Document document = documentBuilder.parse(is);/** 得到 XML ⽂档的根节点 */Element element = document.getDocumentElement();NodeList nodeList = element.getElementsByTagName("student");Student student = null;for (int i = 0; i < nodeList.getLength(); i++) {Node node = nodeList.item(i);int id = Integer.parseInt(node.getAttributes().getNamedItem("id").getNodeValue());String nameValue = "";String sexValue = "";String descValue = "";if (node.hasChildNodes()) {NodeList childNodes = node.getChildNodes();for (int j = 0; j < childNodes.getLength(); j++) {Node node2 = childNodes.item(j);if ("name".equals(node2.getNodeName())) {nameValue = node2.getFirstChild().getTextContent();} else if ("sex".equals(node2.getNodeName())) {sexValue = node2.getFirstChild().getTextContent();} else if ("desc".equals(node2.getNodeName())) {descValue = node2.getFirstChild().getTextContent();}}student = new Student(id, nameValue, sexValue, descValue);students.add(student);}}} catch (Exception e) {e.printStackTrace();}for (int i = 0; students != null && students.size() > 0&& i < students.size(); i++) {System.out.println(students.get(i));}System.out.println("共⽤时:"+(System.currentTimeMillis()-start));}}⽅法⼆:⽤SAX解析XML⽂件package net.nyist.xmlparse.parse.sax;import java.io.IOException;import java.util.ArrayList;import java.util.List;import net.nyist.xmlparse.domain.Student;import org.xml.sax.Attributes;import org.xml.sax.InputSource;import org.xml.sax.Locator;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;/*** @author yuchao** @school 南阳理⼯软件学院移动设备应⽤与开发移动四班** @email yu0312chao@** @time 2014年10⽉1⽇下午6:38:52** @deprecated 本类是⽤来对于XML⽂本的解析类*/public class PersonHandle extends DefaultHandler {private Student student;private List<Student> students;/**对于这个属性的使⽤主要作⽤是为了⽤来存放标签的名称,由此⽽获得这个标签下的⽂本内容的值*/ private String tagName;public List<Student> getStudents() {return students;}public InputSource resolveEntity(String publicId, String systemId)throws IOException, SAXException {return null;}public void setDocumentLocator(Locator locator) {System.out.println("加载器开始处理xml⽂档........");}public void startDocument() throws SAXException {System.out.println("⽂档开始加载.........");students = new ArrayList<Student>();}public void endDocument() throws SAXException {System.out.println("xml⽂档处理结束.........");}public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {tagName = qName;if ("student".equals(qName)) {student = new Student();int id = Integer.parseInt(attributes.getValue("id"));student.setId(id);}}public void endElement(String uri, String localName, String qName)throws SAXException {if ("student".equals(qName)) {students.add(student);}/**将其值变为null的主要⽬的是为了防⽌再次遍历的时候保存了结尾标签,这样会有空值的存在*/tagName = null;}public void characters(char ch[], int start, int length)throws SAXException {if (!"".equals(tagName) && tagName != null) {if ("name".equals(tagName)) {student.setName(new String(ch, start, length));} else if ("sex".equals(tagName)) {student.setSex(new String(ch, start, length));} else if ("desc".equals(tagName)) {student.setDesc(new String(ch, start, length));}}}public static void main(String[] args) {PersonHandle personHandle =new PersonHandle();System.out.println(personHandle.getStudents());}}package net.nyist.xmlparse.parse.sax;import java.io.IOException;import java.io.InputStream;import java.util.List;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import net.nyist.xmlparse.domain.Student;import org.xml.sax.SAXException;/*** @author yuchao** @school 南阳理⼯软件学院移动设备应⽤与开发移动四班** @email yu0312chao@** @time 2014年10⽉1⽇下午6:30:51*/public class SaxFacroryParseDemo {public static void main(String[] args) {long start =System.currentTimeMillis();/** 创建SAX解析器⼯⼚对象*/SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();try {/** 使⽤解析器⼯⼚创建解析器实例 */SAXParser saxParser = saxParserFactory.newSAXParser();/**加载资源⽂件*/InputStream is = SaxFacroryParseDemo.class.getClassLoader().getResourceAsStream("student.xml");/*** 如果采⽤SAX⽅式来对于XML⽂件的处理的时候必须要使⽤xml⽂件的处理类:* 对于本例我使⽤默认的处理类PersonHandle,此类必须要继承 DefaultHandler 这个类,然后重载这个类的⽅法,以⾄于对于xml⽂档的处理 ** */PersonHandle personHandle = new PersonHandle();saxParser.parse(is, personHandle);List<Student> students = personHandle.getStudents();System.out.println("打印⽂档的内容:");for (int i = 0; students != null && i < students.size(); i++)System.out.println(students.get(i));System.out.println("共⽤时:"+(System.currentTimeMillis()-start));} catch (ParserConfigurationException | SAXException | IOException e) {e.printStackTrace();}}}⽅法三:jdom解析XML⽂件:需要引⼊jdom.jar包package net.nyist.xmlparse.parse.jdom;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import net.nyist.xmlparse.domain.Student;import org.jdom.Document;import org.jdom.Element;import org.jdom.JDOMException;import org.jdom.input.SAXBuilder;/*** @author yuchao** @school 南阳理⼯软件学院移动设备应⽤与开发移动四班** @email yu0312chao@** @time 2014年10⽉1⽇下午9:08:47*/public class SAXBuilderDemo {@SuppressWarnings("unchecked")public static void main(String[] args) {long start = System.currentTimeMillis();SAXBuilder saxBuilder = new SAXBuilder();/**加载资源⽂件*/InputStream in = SAXBuilderDemo.class.getClassLoader().getResourceAsStream("student.xml");try {Document document = saxBuilder.build(in);Element element = document.getRootElement();List<Element> list = element.getChildren();if (list != null && list.size() > 0) {List<Student> students = new ArrayList<Student>();for (int i = 0; i < list.size(); i++) {Element studentElement = list.get(i);int id = studentElement.getAttribute("id").getIntValue();String nameValue = studentElement.getChild("name").getText();String sexValue = studentElement.getChild("sex").getText();String descValue = studentElement.getChild("desc").getText();Student student = new Student(id, nameValue, sexValue,descValue);students.add(student);}for (int i = 0; students != null && i < students.size(); i++)System.out.println(students.get(i));System.out.println("共⽤时:"+ (System.currentTimeMillis() - start));}} catch (JDOMException | IOException e) {e.printStackTrace();}}}⽅法四:通过dom4j解析XML⽂件:引⼊两个包dom4j.jar 与jaxen.jar package net.nyist.xmlparse.parse.dom4j;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import net.nyist.xmlparse.domain.Student;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;/*** @author yuchao** @school 南阳理⼯软件学院移动设备应⽤与开发移动四班** @email yu0312chao@** @time 2014年10⽉1⽇下午9:45:12*/public class SAXReaderDemo {@SuppressWarnings("unchecked")public static void main(String[] args) {long start = System.currentTimeMillis();SAXReader saxReader =new SAXReader();InputStream in =SAXReaderDemo.class.getClassLoader().getResourceAsStream("student.xml");try {Document document = saxReader.read(in);Element element = document.getRootElement();List<Element> rootElements = element.elements();List<Student> students =new ArrayList<Student>();Student student =null;for (int i = 0;rootElements!=null && i < rootElements.size(); i++) {Element childElement = rootElements.get(i);int id =Integer.parseInt(childElement.attribute("id").getText());String nameValue =childElement.elementText("name");String sexValue =childElement.elementText("sex");String descValue =childElement.elementText("desc");student =new Student(id, nameValue, sexValue, descValue);students.add(student);}for (int i = 0; students != null && i < students.size(); i++)System.out.println(students.get(i));System.out.println("共⽤时:"+ (System.currentTimeMillis() - start));} catch (DocumentException e) {e.printStackTrace();}}}。
XML格式文件的应用与打开方法一、什么是xml格式文件XML是可扩展标记语言(eXtensible Markup Language)的缩写,它是一种用于标记电子文件结构和传输数据的标记语言。
XML文件使用自定义标签来描述数据的结构和含义,可以被用于在不同系统之间进行数据交换和共享。
XML文件可以被解析和处理,使得数据能够被有效地存储、传输和展示。
XML被广泛应用于Web开发、数据交换、配置文件等领域。
二、XML格式文件的应用1. Web开发XML(可扩展标记语言)是用于存储和传输数据的标准标记语言,它与HTML一起被广泛用于创建动态和交互式的网页。
在网页开发中,XML常被用于存储配置信息,如网站的元数据、页面的布局和样式等。
此外,XML还用于在不同系统之间进行数据交换,使得数据能在不同的应用程序和平台上共享和交互。
由于其结构化、灵活性和跨平台性,XML在数据存储和传输领域发挥着不可或缺的作用。
在网页开发中,XML有诸多优势,使得它在数据存储和传输方面成为理想的选择。
首先,XML的结构化特性使得数据易于理解和解析,这对于在不同系统间进行数据交换非常关键。
其次,XML的跨平台性使得数据可以在不同的应用程序和操作系统上共享和交互。
此外,XML还具有灵活性,可以轻松地表示复杂的数据结构,并支持自定义标记,以适应特定应用的需求。
在网页开发中,利用这些优势,XML可以用于存储配置信息、实现数据驱动的动态内容、以及与其他系统进行数据交换等。
通过合理地使用XML,可以提高网页的可维护性、可扩展性和交互性,为创建高性能的网站提供有力支持。
2. 数据交换XML的跨平台性和标准化特性,使其成为不同系统之间进行数据交换的理想选择。
在Web服务中,XML被广泛用于传输数据,使得不同的应用程序能够通过统一的格式进行数据交换。
它能够清晰地表示数据的结构和含义,使得不同系统能够准确解析和解读数据。
此外,XML还可以在不同数据库之间进行数据转换,实现数据的共享和集成。
c解析xml常用方法解析XML是指将XML文档中的数据提取与分析的过程。
XML是一种标记语言,用于描述数据的结构与内容。
常用的XML解析方法包括DOM、SAX和StAX。
DOM解析:DOM(Document Object Model)是一种将XML文档表示为文档树的解析方法。
DOM解析将整个XML文档加载到内存中,并构建一个树形结构,可以方便地对XML文档进行遍历和操作。
常用的DOM解析类包括DocumentBuilder和Document类。
1.创建DOM解析器:```javaDocumentBuilderFactory factory =DocumentBuilderFactory.newInstance(;DocumentBuilder builder = factory.newDocumentBuilder(;```2.加载XML文档:```javaDocument document = builder.parse(new File("file.xml")); //通过文件Document document = builder.parse(inputStream); //通过输入流Document document = builder.parse(url); //通过URL```3.获取根节点:```javaElement rootElement = document.getDocumentElement(;```4.遍历子节点:```javaNodeList nodeList = rootElement.getChildNodes(;for (int i = 0; i < nodeList.getLength(; i++)Node node = nodeList.item(i);if (node.getNodeType( == Node.ELEMENT_NODE)Element element = (Element) node;//处理子节点}```SAX解析:SAX(Simple API for XML)是一种基于事件驱动的解析方法。
1)DOM(JAXP Crimson解析器)DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。
DOM是以层次结构组织的节点或信息片断的集合。
这个层次结构允许开发人员在树中寻找特定信息。
分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。
由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。
DOM 以及广义的基于树的处理具有几个优点。
首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。
它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。
DOM使用起来也要简单得多。
2)SAXSAX处理的优点非常类似于流媒体的优点。
分析能够立即开始,而不是等待所有的数据被处理。
而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。
这对于大型文档来说是个巨大的优点。
事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。
一般来说,SAX还比它的替代者DOM快许多。
选择DOM还是选择SAX?对于需要自己编写代码来处理XML文档的开发人员来说,选择DOM 还是SAX解析模型是一个非常重要的设计决策。
DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。
DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。
用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。
可以很容易的添加和修改树中的元素。
然而由于使用DOM解析器的时候需要处理整个XML 文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。
由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。
SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。
查看文章4种常见的xml解析方法2009-11-03 14:40==========================================xml文件<?xml version="1.0" encoding="GB2312"?><RESULT><VALUE><NO>A1234</NO><ADDR>四川省XX县XX镇XX路X段XX号</ADDR></VALUE><VALUE><NO>B1234</NO><ADDR>四川省XX市XX乡XX村XX组</ADDR></VALUE></RESULT>需要什么包自己到网上找下吧?==========================================1)DOM(JAXP Crimson解析器)DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。
DOM是以层次结构组织的节点或信息片断的集合。
这个层次结构允许开发人员在树中寻找特定信息。
分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。
由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。
DOM 以及广义的基于树的处理具有几个优点。
首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。
它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。
DOM使用起来也要简单得多。
import java.io.*;import java.util.*;import org.w3c.dom.*;import javax.xml.parsers.*;public class MyXMLReader{public static void main(String arge[]){long lasting =System.currentTimeMillis();try{File f=new File("data_10k.xml");DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();DocumentBuilder builder=factory.newDocumentBuilder();Document doc = builder.parse(f);NodeList nl = doc.getElementsByTagName("VALUE");for (int i=0;i<nl.getLength();i++){System.out.print("车牌号码:" +doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue() );System.out.println("车主地址:" +doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue ());}}catch(Exception e){e.printStackTrace();}==========================================2)SAXSAX处理的优点非常类似于流媒体的优点。
三种解析XML文件的方法在Android平台上可以使用Simple API for XML(SAX) 、 Document Object Model(DOM)和Android附带的pull解析器解析XML文件。
下面是本例子要解析的XML文件:文件名称:china.xml例子定义了一个javabean用于存放上面解析出来的xml内容,这个javabean为Person,代码:使用SAX读取XML文件SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。
SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。
所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。
下面是一些ContentHandler接口常用的方法:startDocument()当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。
endDocument()和上面的方法相对应,当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。
startElement(String namespaceURI, String localName, String qName, Attributes atts) 当读到一个开始标签的时候,会触发这个方法。
namespaceURI就是命名空间,localName 是不带命名空间前缀的标签名,qName是带命名空间前缀的标签名。
通过atts可以得到所有的属性名和相应的值。
要注意的是SAX中一个重要的特点就是它的流式处理,当遇到一个标签的时候,它并不会纪录下以前所碰到的标签,也就是说,在startElement()方法中,所有你所知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的信息,都是不得而知的,都需要你的程序来完成。
MFC读取XML⽂件并解析现在经常会对XML⽂件进⾏操作,怎么在MFC下去读和解析XML⽂件呢?直接上代码:⾸先得等在stdafx.h中加⼊这句,以引⼊MSXML命名空间#import <msxml3.dll> named_guidsusing namespace MSXML2;然后再要使⽤的类的头⽂件加⼊://XML Parser intellectural pointer (used in parsing XML file)MSXML2::IXMLDOMDocument2Ptr m_plDomDocument;MSXML2::IXMLDOMElementPtr m_pDocRoot;然后在初始化函数中加⼊对XML COM的初始化://intianlize XML Parser COM::CoInitialize(NULL);HRESULT hr = m_plDomDocument.CreateInstance(MSXML2::CLSID_DOMDocument);if(FAILED(hr)){_com_error er(hr);AfxMessageBox(er.ErrorMessage());EndDialog(1);}接着是具体的函数:void CDemoDlg::OnBnClickedButtonOpenxml(){// at first ,we should clear m_strXML's contents to show new datam_strXMLData = "";CFileDialog fileDlg(TRUE);if(IDOK == fileDlg.DoModal()){m_strXMLPath = fileDlg.GetPathName();m_strXMLContents = "Empty document";//just in case you don't get anythingUpdateData(FALSE);//Specify XML file nameCString strFileName = m_strXMLPath;//Convert XML file name string to something COM can handle_bstr_t bstrFileName;bstrFileName = strFileName.AllocSysString();//Call the IXMLDOMDocumentPtr's load function to load XML filevariant_t vResult;vResult = m_plDomDocument->load(bstrFileName);if(((bool)vResult) == TRUE ) //success{//Convert bstr to something you can use in VC++_bstr_t bstrDocContents = m_plDomDocument->xml;m_strXMLContents = (LPCTSTR) bstrDocContents;//get XML data and show on Edit ControlMSXML2::IXMLDOMNodePtr m_pXMLRoot = m_plDomDocument->documentElement; //first child is point//m_strXMLData = _T(",") + DisplayXMLChildren(m_pXMLRoot);//loop to show get point's Lon and Lan and save in map<CString,CString>LonLanPointsfor(MSXML2::IXMLDOMNodePtr pChild = m_pXMLRoot->firstChild; pChild != NULL; pChild = pChild->nextSibling) {DisplayXMLChildren(pChild);}}else{m_strXMLContents = "Document FAILED to load!";}UpdateData(FALSE);}}//in case of overload data we use before, we should add one button for clear the data(Ready to transfrom) CString CDemoDlg::DisplayXMLChildren(MSXML2::IXMLDOMNodePtr pParent){//Display current node's name//every parent's node name is POINTCString strElement = ((LPCTSTR)pParent->nodeName); //output is point//loop to get data pChild's parent node is point,and point's parent node is roadfor(MSXML2::IXMLDOMNodePtr pChild = pParent->firstChild; pChild != NULL; pChild = pChild->nextSibling) {//strElement += ((LPCTSTR)pChild->nodeName);CString nodeName = ((LPCTSTR)pChild->nodeName);CString Lon = _T("Lon");CString Lan = _T("Lan");CString currentLon,currentLan;if ( nodeName == Lon ){currentLon = ((LPCTSTR)pChild->text);}if ( nodeName == Lan ){currentLan = ((LPCTSTR)pChild->text);}//add one point's Lon and Lan to mapLonLanPoints.insert(currentLon,currentLan);}return strElement;}XML结构为:<road><point><id><id/><Lon></Lon><Lat></Lat></road>。
xml解析⼀.定义1)DOM(JAXP Crimson解析器Document Object Model)DOM是⽤与平台和语⾔⽆关的⽅式表⽰XML⽂档的官⽅W3C标准。
DOM是以层次结构组织的节点或信息⽚断的集合。
这个层次结构允许开发⼈员在树中寻找特定信息。
分析该结构通常需要加载整个⽂档和构造层次结构,然后才能做任何⼯作。
由于它是基于信息层次的,因⽽DOM被认为是基于树或基于对象的。
DOM以及⼴义的基于树的处理具有⼏个优点。
⾸先,由于树在内存中是持久的,因此可以修改它以便应⽤程序能对数据和结构作出更改。
它还可以在任何时候在树中上下导航,⽽不是像SAX那样是⼀次性的处理。
DOM使⽤起来也要简单得多。
2)SAX (Simple API for XML)SAX处理的优点⾮常类似于流媒体的优点。
分析能够⽴即开始,⽽不是等待所有的数据被处理。
⽽且,由于应⽤程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。
这对于⼤型⽂档来说是个巨⼤的优点。
事实上,应⽤程序甚⾄不必解析整个⽂档;它可以在某个条件得到满⾜时停⽌解析。
⼀般来说,SAX 还⽐它的替代者DOM快许多。
选择DOM还是选择SAX?对于需要⾃⼰编写代码来处理XML⽂档的开发⼈员来说,选择DOM还是SAX解析模型是⼀个⾮常重要的设计决策。
DOM采⽤建⽴树形结构的⽅式访问XML⽂档,⽽SAX采⽤的事件模型。
DOM解析器把XML⽂档转化为⼀个包含其内容的树,并可以对树进⾏遍历。
⽤DOM解析模型的优点是编程容易,开发⼈员只需要调⽤建树的指令,然后利⽤navigation APIs访问所需的树节点来完成任务。
可以很容易的添加和修改树中的元素。
然⽽由于使⽤DOM解析器的时候需要处理整个XML⽂档,所以对性能和内存的要求⽐较⾼,尤其是遇到很⼤的XML⽂件的时候。
由于它的遍历能⼒,DOM解析器常⽤于XML⽂档需要频繁的改变的服务中。
SAX解析器采⽤了基于事件的模型,它在解析XML⽂档的时候可以触发⼀系列的事件,当发现给定的tag的时候,它可以激活⼀个回调⽅法,告诉该⽅法制定的标签已经找到。
MsXml创建和解析XML⽰例⼀.MsXml创建XML⽂档⽰例// XmlCreationDemo.cpp#include <stdlib.h>#include <stdio.h>// 引⼊MSXML解析器#import <msxml4.dll>using namespace MSXML2;class InitializeCom{public:InitializeCom() { CoInitialize(NULL); }~InitializeCom() { CoUninitialize(); }}InitCom;int main(){char *szXmlFile = "D://china.xml"; // xml⽂件MSXML2::IXMLDOMDocumentPtr pDoc = NULL; // xml⽂档MSXML2::IXMLDOMProcessingInstructionPtr pProInstruction = NULL; // xml声明MSXML2::IXMLDOMCommentPtr pComment = NULL; // 注释MSXML2::IXMLDOMElementPtr pRootElement = NULL, pElement = NULL; // 根节点(元素)MSXML2::IXMLDOMNodePtr pNode = NULL, pNode1 = NULL, pNode2 = NULL; // 节点MSXML2::IXMLDOMAttributePtr pAttrNode = NULL; // 属性HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40)); //if (FAILED(hr)){printf("⽆法创建DOMDocument40对象,请检查是否安装并初始化了MsXml Parser库!");return EXIT_FAILURE;}// (1)创建xml⽂档声明(或insertBefore根节点)pProInstruction = pDoc->createProcessingInstruction((_bstr_t)(char*)"xml", (_bstr_t)(char*)"version=\"1.0\" encoding=\"utf-8\""); pDoc->appendChild((MSXML2::IXMLDOMNode*)pProInstruction);// (2)创建根节点<China>pRootElement = pDoc->createElement((_bstr_t)(char*)"China");pDoc->PutRefdocumentElement(pRootElement); // pXMLDomDoc->documentElement = pRootElement;// (3)创建节点<China><Continent>pComment = pDoc->createComment((_bstr_t)(char*)"所在的洲");pRootElement->appendChild((MSXML2::IXMLDOMNode*)pComment); // 注释pNode = pDoc->createNode((_variant_t)(long)MSXML2::NODE_ELEMENT, (_bstr_t)(char*)"Continent", (_bstr_t)(char*)"");pNode->Puttext((_bstr_t)(char*)"Asia"); // pNode->text = "Asia";pRootElement->appendChild(pNode); // 节点// (4)创建节点<China><Population>pComment = pDoc->createComment((_bstr_t)(char*)"⼈⼝数量");pRootElement->appendChild((MSXML2::IXMLDOMNode*)pComment); // 注释pElement = pDoc->createElement((_bstr_t)(char*)"Population");pAttrNode = pDoc->createAttribute((_bstr_t)(char*)"Units");pAttrNode->Puttext((_bstr_t)(char*)"Million Person");pElement->setAttributeNode(pAttrNode); // 统计单位pElement->setAttribute((_bstr_t)(char*)"StatisticalYear", (_variant_t)(char*)"2000"); // 统计年份pElement->Puttext((_bstr_t)(char*)"1,296");pRootElement->appendChild(pElement); // 节点// (5)创建节点<China><Municipality>pComment = pDoc->createComment((_bstr_t)(char*)"四个直辖市");pRootElement->appendChild((MSXML2::IXMLDOMNode*)pComment); // 注释pNode = pDoc->createNode((_variant_t)(long)MSXML2::NODE_ELEMENT, (_bstr_t)(char*)"Municipality", (_bstr_t)(char*)"");pRootElement->appendChild(pNode); // 节点// (6)创建节点<China><Municipality><TianJin>pNode1 = pDoc->createNode((_variant_t)(long)MSXML2::NODE_ELEMENT, (_bstr_t)(char*)"TianJin", (_bstr_t)(char*)"");// 创建节点<China><Municipality><TianJin><Area>pElement = pDoc->createElement((_bstr_t)(char*)"Area");pElement->setAttribute((_bstr_t)(char*)"Units", (_variant_t)(char*)"Thousand Square kilometers"); // 统计单位pElement->Puttext((_bstr_t)(char*)"12");pNode1->appendChild((MSXML2::IXMLDOMNode*)pElement); // 节点// 创建节点<China><Municipality><TianJin><Population>pElement = pDoc->createElement((_bstr_t)(char*)"Population");pElement->setAttribute((_bstr_t)(char*)"Units", (_variant_t)(char*)"Million Person"); // 统计单位pElement->setAttribute((_bstr_t)(char*)"StatisticalYear", (_variant_t)(char*)"2000"); // 统计年份pElement->Puttext((_bstr_t)(char*)"10.01");pNode1->appendChild((MSXML2::IXMLDOMNode*)pElement); // 节点pNode->appendChild(pNode1);// (7)创建节点<China><Municipality><BeiJing>并插⼊<TianJin>前pNode2 = pDoc->createNode((_variant_t)(long)MSXML2::NODE_ELEMENT, (_bstr_t)(char*)"BeiJing", (_bstr_t)(char*)""); // 创建节点<China><Municipality><BeiJing><Area>pElement = pDoc->createElement((_bstr_t)(char*)"Area");pElement->setAttribute((_bstr_t)(char*)"Units", (_variant_t)(char*)"Thousand Square kilometers"); // 统计单位pElement->Puttext((_bstr_t)(char*)"17");pNode2->appendChild((MSXML2::IXMLDOMNode*)pElement); // 节点// 创建节点<China><Municipality><BeiJing><Population>pElement = pDoc->createElement((_bstr_t)(char*)"Population");pElement->setAttribute((_bstr_t)(char*)"Units", (_variant_t)(char*)"Million Person"); // 统计单位pElement->setAttribute((_bstr_t)(char*)"StatisticalYear", (_variant_t)(char*)"2000"); // 统计年份pElement->Puttext((_bstr_t)(char*)"13.82");pNode2->appendChild((MSXML2::IXMLDOMNode*)pElement); // 节点pNode->insertBefore(pNode2, (_variant_t)(IDispatch*)pNode1);//// (8)创建节点<China><Municipality><ShangHai>// (9)创建节点<China><Municipality><ChongQing>pDoc->save((_variant_t)szXmlFile);return EXIT_SUCCESS;}⽣成的china.xml⽂档内容:<?xml version="1.0" encoding="utf-8"?><China><!--所在的洲--><Continent>Asia</Continent><!--⼈⼝数量--><Population Units="Million Person" StatisticalYear="2000">1,296</Population><!--四个直辖市--><Municipality><BeiJing><Area Units="Thousand Square kilometers">17</Area><Population Units="Million Person" StatisticalYear="2000">13.82</Population></BeiJing><TianJin><Area Units="Thousand Square kilometers">12</Area><Population Units="Million Person" StatisticalYear="2000">10.01</Population></TianJin><ShangHai><Area Units="Thousand Square kilometers">6.4</Area><Population Units="Million Person" StatisticalYear="2000">16.74</Population></ShangHai><ChongQing><Area Units="Thousand Square kilometers">84</Area><Population Units="Million Person" StatisticalYear="2000">30.90</Population></ChongQing></Municipality></China>⼆.MsXml解析XML⽂档⽰例// XmlParsingDemo.cpp#include <stdlib.h>#include <stdio.h>// 引⼊MSXML解析器#import <msxml4.dll>using namespace MSXML2;class InitializeCom{public:InitializeCom() { CoInitialize(NULL); // Initializes the COM library }~InitializeCom() { CoUninitialize(); // Closes the COM library }}InitCom;int main(){char *szXmlFile = "D://china.xml"; //上篇创建的xml⽂档IXMLDOMDocumentPtr pDoc = NULL; // xml⽂档IXMLDOMNodeListPtr pNodeList = NULL; // 节点链表IXMLDOMElementPtr pRootElement = NULL, pElement = NULL; // 根节点(元素)IXMLDOMNodePtr pNode = NULL, pNode1 = NULL; // 节点IXMLDOMNamedNodeMapPtr pAttrList = NULL; // 属性链表IXMLDOMAttributePtr pAttrNode = NULL; // 属性long lChilds, lAttr, i;HRESULT hr = pDoc.CreateInstance(__uuidof(DOMDocument40));if (FAILED(hr)){printf("⽆法创建DOMDocument40对象,请检查是否安装并初始化了MsXml Parser库!");return EXIT_FAILURE;}VARIANT_BOOL bXmlLoad = pDoc->load((_variant_t)szXmlFile);if (!bXmlLoad) // 加载失败{printf("加载%s失败!/n", szXmlFile);return EXIT_FAILURE;}// (1)根节点pRootElement = pDoc->GetdocumentElement();printf("root = %s/n", (char*)pRootElement->GetnodeName()); // pRootElement->nodeName// (2)根节点的⼀级⼦节点pNodeList = pRootElement->GetchildNodes(); // pRootElement->childNodeslChilds = pNodeList->Getlength(); // pNodeList->lengthfor (i = 0; i < lChilds; i++){pNode = pNodeList->Getitem(i); // pNodeList->item[i]if (pNode->GetnodeType() != NODE_COMMENT) // 过滤注释节点{printf("child[%d] of [%s]: [%s]/n", i ,(char*)pRootElement->GetnodeName(), (char*)pNode->GetnodeName());}}// (3)统计⽂档中所有的<Population>节点pNodeList = pDoc->getElementsByTagName((_bstr_t)(char*)"Population");lChilds = pNodeList->Getlength();printf("⽂档中[Population]共有%d个/n", lChilds);// (4)根节点下的<Population>节点pNode = pRootElement->selectSingleNode((_bstr_t)(char*)"Population");// 已知根节点为<China>时:pNode = pDoc->selectSingleNode((_bstr_t)(char*)"China//Population");printf("根节点下的[Population]⼦节点值为%s/n", (char*)pNode->Gettext());pAttrList = pNode->Getattributes();lAttr = pAttrList->Getlength();for (i = 0; i < lAttr; i++){pAttrNode = pAttrList->Getitem(i);printf("Attr[%d] of [%s]: %s = %s/n", i, (char*)pNode->GetnodeName(), (char*)pAttrNode->GetnodeName(), (char*)pAttrNode->Gettext()); }// (5)查找节点<Municipality>下的所有⼦节点// "//"表⽰在任意⼀层寻找Municipality;"//*"查找<Municipality></Municipality>中的所有⼦节点pNodeList = pDoc->selectNodes((_bstr_t)(char*)"//Municipality//*"); // 这⾥可将pDoc换成pRootElementwhile (pNode = pNodeList->nextNode()){printf("childs of [Municipality]: %s/n", (char*)pNode->GetnodeName());}// (6)查找节点<Municipality>下的⼀级⼦节点pNode = pRootElement->selectSingleNode((_bstr_t)(char*)"Municipality");pNodeList = pNode->GetchildNodes();lChilds = pNodeList->Getlength();for (i = 0; i < lChilds; i++){pNode1 = pNodeList->Getitem(i); // pNodeList->item[i]printf("child[%d] of [Municipality]: %s/n", i, (char*)pNode1->GetnodeName());}// (7)查询⽗、⼦、兄、弟节点pNode = pRootElement->selectSingleNode((_bstr_t)(char*)"//TianJin");pNode1 = pNode->GetparentNode(); // ⽗节点printf("[TianJin]的⽗节点为[%s]/n", (char*)pNode1->GetnodeName());pNodeList = pNode->GetchildNodes(); // ⼦节点lChilds = pNodeList->Getlength();for (i = 0; i < lChilds; i++){pNode1 = pNodeList->nextNode();printf("child[%d] of [TianJin]: %s/n", i, (char*)pNode1->GetnodeName());}pNode1 = pNode->GetpreviousSibling(); // 兄节点printf("[TianJin]的兄节点为[%s]/n", (char*)pNode1->GetnodeName()); pNode1 = pNode->GetnextSibling(); // 弟节点printf("[TianJin]的弟节点为[%s]/n", (char*)pNode1->GetnodeName()); return EXIT_SUCCESS;}运⾏结果如下:root = Chinachild[1] of <China>: <Continent>child[3] of <China>: <Population>child[5] of <China>: <Municipality>⽂档中<Population>共有5个根节点下的<Population>⼦节点值为1,296Attr[0] of <Population>: Units = Million PersonAttr[1] of <Population>: StatisticalYear = 2000childs of <Municipality>: BeiJingchilds of <Municipality>: Areachilds of <Municipality>: Populationchilds of <Municipality>: TianJinchilds of <Municipality>: Areachilds of <Municipality>: Populationchilds of <Municipality>: ShangHaichilds of <Municipality>: Areachilds of <Municipality>: Populationchilds of <Municipality>: ChongQingchilds of <Municipality>: Areachilds of <Municipality>: Populationchild[0] of <Municipality>: BeiJingchild[1] of <Municipality>: TianJinchild[2] of <Municipality>: ShangHaichild[3] of <Municipality>: ChongQing<TianJin>的⽗节点为<Municipality>child[0] of <TianJin>: Areachild[1] of <TianJin>: Population<TianJin>的兄节点为<BeiJing><TianJin>的弟节点为<ShangHai>。
∙VC++中利用MSXML解析XML文档∙作者:未知来源:网络日期:2007-3-22 21:55:45∙一、XML 简介XML(Xtensible Markup Language,即扩展标记语言)的发展起源于1996年。
当时,出版界巨头和Web 业内人士经过共同讨论,提出了创建SGML(Standard Generalized Markup Language,即标准通用标识语言)子集(HML)的建议。
该子集专用于Web,具有可扩展(或可扩充)性,并且能利用结构化标记语言的所有高级功能,但摒弃了SGML的复杂性。
XML规范的第一份草稿于1996年11月发布后不久,1997年1月首个XML解析器就面世了。
随后,便出现了XML的应用以及新的规范和解析器。
HTML(Hypertext Markup Language)语言是大家所熟悉的开发网页的一种标记语言,但它不是一种编程语言,它的主要标记是针对文档内容本身结构的描述,因机器本身是不能够解析它的内容的。
XML语言是SGML语言的子集,它保留了SGML主要的使用功能,同时大大减小了SGML的复杂性。
它不仅能表示文档的内容,而且可以表示文档的结构,这样在能够被人类理解的同时,也能够被机器所理解。
虽然HTML 是SGML的一个应用,XML是SGML的一个子集,但是XML绝不是在HTML上添加某些元素而形成的,它们之间是有很大区别的。
最大的区别就是XML允许使用者为某种特殊目的而定义自已的元素。
除此之外,另一个最主要的区别就是XML致力解决的问题,正是在使用HTML时所遇到的一些特殊问题。
XML要求遵循一定的严格标准,其分析程序比HTML浏览器对语法和结构的要求更加严格。
XML文档每次分析的结果都一致,而HTML在不同的浏览器中可能会作出不同的分析和显示。
同时,XML标准是对数据的处理应用,而不只是针对Web页的,它还可涉及到数据库电子商务系统,以及任何显示系统的高级应用。
开发者可根据特定的工业需求,利用XML创建自定义的数据结构。
这些数据结构和数据库可以在许多设备上查看,而不需要使用自定义的接口在不同的显示设备上查看相同的数据。
XML主要有三个要素:文档类型声明(DTD:Document Type Declaration)或XML Schema(XML大纲)、可扩展样式语言(XSL:eXtensible Stylesheet Language)和可扩展链接语言(XLink:eXtensible Link Language)。
DTD和XML大纲规定了XML文件的逻辑结构,定义了XML文件中的元素、元素的属性以及元素与元素属性之间的关系;Namespace(名域)实现了统一的XML文档数据表示以及数据的相互集成;XSL是用于规定XML文档呈现样式的语言,它使得数据与其表现形式相互独立,比如XSL能使Web浏览器改变文档的表示法,如数据显示顺序的变化,不需要再与服务器进行通讯。
通过改变样式表,同一个文档可以显示得更大,或者经过折叠只显示外面的一层,或者可以变为打印的格式。
而XLink 将进一步扩展目前Web上已有的简单链接。
二、文档对象模型(DOM)DOM是Document Object Model(文档对象模型)的简称,是对Web文档进行应用开发、编程的应用程序接口(API)。
作为W3C公布的一种跨平台、与语言无关的接口规范,DOM提供了在不同环境和应用中的标准程序接口,可以用任何语言实现。
DOM采用对象模型和一系列的接口来描述XML文档的内容和结构,即利用对象把文档模型化。
这种对象模型实现的基本功能包括:描述文档表示和操作的接口;·接口的行为和属性;·接口之间的关系以及互操作。
DOM可对结构化的XML文档进行解析,文档中的指令、元素、实体、属性等所有内容个体都用对象模型表示,整个文档被看成是一个有结构的信息树,而不是简单的文本流,生成的对象模型就是树的节点,对象同时包含了方法和属性。
因此,对文档的所有操作都是在对象树上的进行。
在DOM中,树中的一切都是对象,不管是根节点还是实体的属性。
在DOM中主要有以下三个对象:· XML文档对象XML文档既是一种对象,同时又代表整个XML文档。
它由根元素和子元素组成。
· XML节点对象XML节点对象代表的是XML文档内部的节点,如元素、注释、名字空间等。
· XML节点列表XML文档模块列表代表了节点的集合。
利用DOM,开发人员可以动态地创建XML文档,遍历结构,添加、修改、删除内容等。
其面向对象的特性,使人们在处理XML解析相关的事务时节省大量的精力,是一种符合代码重用思想的强有力编程工具。
三、MSXML从理论上说,根据XML的格式定义,我们可以自己编写一个XML的语法分析器,但实际上微软已经给我们提供了一个XML语法解析器,即一个叫做MSXML.DLL的动态链接库,实际上它是一个COM(Component Object Model)对象库,里面封装了进行XML解析时所需要的所有对象。
因为COM是一种以二进制格式出现的和语言无关的可重用对象,所以你可以用任何语言(比如VB,VC,DELPHI,C++ Builder甚至是剧本语言等等)对它进行调用,在你的应用中实现对XML文档的解析。
MSXML.DLL所包括的主要COM接口有:1. DOMDocumentDOMDocument对象是XML DOM的基础,你可以利用它所暴露的属性和方法来浏览、查询和修改XML 文档的内容和结构。
DOMDocument表示了树的顶层节点,它实现了DOM文档的所有的基本方法,并且提供了额外的成员函数来支持XSL和XSLT。
它创建了一个文档对象,所有其他的对象都可以从这个文档对象中得到和创建。
2. IXMLDOMNodeIXMLDOMNode是文档对象模型(DOM)中的基本对象,元素、属性、注释、过程指令和其他的文档组件都可以认为是IXMLDOMNode。
事实上,DOMDocument对象本身也是一个IXMLDOMNode对象。
3. IXMLDOMNodeListIXMLDOMNodeList实际上是一个节点(Node)对象的集合,节点的增加、删除和变化都可以在集合中立刻反映出来,可以通过"for...next"结构来遍历所有的节点。
4. IXMLDOMParseErrorIXMLDOMParseError接口用来返回在解析过程中所出现的详细的信息,包括错误号、行号、字符位置和文本描述。
在具体应用时可以用DOMDocument的Load方法来装载XML文档,用IXMLDOMNode 的selectNodes (查询的结果有多个,得到存放搜索结果的链表)或selectSingleNode(查询的结果有一个,在有多个的情况下返回找到的第一个节点)方法进行查询,用createNode和appendChild方法来创建节点和追加节点,用IXMLDOMElement的setAttribute和getAttribute方法来设置和获得节点的属性。
四、程序实现下面通过一个具体的实例来说明在VC++中如何利用MSXML解析XML文档。
(1)源XML文档(xmlfile.xml)如下:<?xml version="1.0" encoding="GB2312"?><Device id="10041" name="设备1"><Type>13</Type><TypeName>保护</TypeName></Device>我们在源文档中查找"Device",将其"name"属性设置为"测试设备",为其添加"Model"节点,并设置其文本为"3"。
(2)源程序如下:CoInitialize(NULL);// 初始化COM。
CComPtr<IXMLDOMDocument>spXMLDOM;HRESULT hr=spXMLDOM.CoCreateInstance (_uuidof(DOMDocument));// 创建解析器实例。
VARIANT_BOOL bSuccess=false;hr=spXMLDOM->load(CComVariant(L"xmlfile.xml"),&bSuccess);// 装载XML文档。
CComBSTR bstrSS(L"Device");CComPtr<IXMLDOMNode>spDevice;hr=spXMLDOM->selectSingleNode(bstrSS,&spDevice); //搜索"Device"。
CComQIPtr<IXMLDOMElement>spDev;spDev=spDevice;// 设置"Device"的"name"属性。
hr= spDev ->setAttribute(CComBSTR(L"name"),CComVariant("测试设备"));CComPtr<IXMLDOMNode>spModelNode; hr=spXMLDOM->createNode(CComVariant(NODE_ELEMENT),ComBSTR("Model"),NULL,& spModelNode); // 创建"Model"节点。
CComPtr<IXMLDOMNode>spInsertedNode;hr=spDevice->appendChild (spModelNode,&spInsertedNode);// 添加新节点到"Device"节点下面。
CString strID="3";hr=spInsertedNode->put_text(strID.AllocSysString());// 设置"Model"的文本。
hr=spXMLDOM->save(CComVariant("xmlfile.xml")); / /保存文档。
CoUninitialize(); // 结束对COM的使用。
因为篇幅的原因,上述代码的每步操作并未对返回的HRESULT类型进行判断,也未进行异常的捕获处理,在实际的编程中读者应根据返回的hr进行决断,以决定程序的流程,同时应进行异常的捕获处理。