第八章C#解析XML.ppt

上传人:本田雅阁 文档编号:3454521 上传时间:2019-08-27 格式:PPT 页数:58 大小:350.54KB
返回 下载 相关 举报
第八章C#解析XML.ppt_第1页
第1页 / 共58页
第八章C#解析XML.ppt_第2页
第2页 / 共58页
第八章C#解析XML.ppt_第3页
第3页 / 共58页
第八章C#解析XML.ppt_第4页
第4页 / 共58页
第八章C#解析XML.ppt_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《第八章C#解析XML.ppt》由会员分享,可在线阅读,更多相关《第八章C#解析XML.ppt(58页珍藏版)》请在三一文库上搜索。

1、第八章 C#解析XML,8.1 C#读写XML的几种方式 8.2 DOM 8.3 流模型 8.4 验证有效性,8.1 C#读写XML的几种方式,在针对XML文档的应用编程接口中,一般有两种模型:W3C制定的DOM(Document Object Method,文档对象模型)和流模型 流模型中有两种变体“推”模型(代表为由David Megginson领导的SAX-SimpleAPI for XML,用于XML的简单API)和“拉”模型(.Net中的流模型)。,8.1 C#读写XML的几种方式,XML解析方法之“推”模型: “推”模型也就是常说的SAX,SAX是一种靠事件驱动的模型。它每发现一个

2、节点就用“推”模型引发一个事件,而我们必须编写这些事件的处理程序,很麻烦。,8.1 C#读写XML的几种方式,C# XML解析方法之“拉”模型: .NET中使用的是基于“拉”模型的实现方案。 “拉”模型在遍历文档时会把感兴趣的文档部分从读取器中拉出,不需要引发事件,允许我们以编程的方式访问文档,这大大的提高了灵活性,“拉”模型可以选择性的处理节点。在.NET中,“拉”模型通过XML阅读器(XMLTextReader类)来实现的。该类提供Xml文件读取的功能,它可以验证文档是否格式良好,如果不是格式良好的Xml文档,该类在读取过程中将会抛出XmlException异常。任何时候在内存中只有当前节

3、点,但它是只读的,向前的,不能在文档中执行向后导航操作。,8.1 C#读写XML的几种方式,C# XML解析方法之DOM: DOM的好处在于它允许编辑和更新XML文档,可以随机访问文档中的数据,可以使用XPath查询。但是,DOM的缺点在于它需要一次性的加载整个文档到内存中,对于大型的文档,这会造成资源问题。在.NET中使用XML DOM分析器(XMLDocument)实现DOM模型。,8.1 C#读写XML的几种方式,因此,.NET Framework完全支持XML DOM模式,但它不支持SAX模式。.NET Framework支持两种不同的分析模式:XML DOM分析器(XMLDocume

4、nt类)和XML阅读器(XMLTextReader类),不支持SAX分析器, 但这并不意味着它没有提供类似SAX分析器的功能。通过XML阅读器可以将SAX的所有的功能很容易的实现及更有效的运用。,8.1 C#读写XML的几种方式,SAX和DOM在实现过程中,分别侧重于不同的方面以满足不同的应用需求。DOM为开发基于XML的应用系统提供了便利。它通过一种随机访问机制,使得应用程序利用该接口可以在任何时候访问XML文档中的任何一部分数据,也可以对XML文档中的数据进行插入、删除、修改、移动等操作。在DOM中,文档的逻辑结构类似一棵树。文档、文档中的根、元素、元素内容、属性、属性值等都是以对象模型的

5、形式表示的。DOM的优点在于它在内存中保存文档的整个模型。这使得能以任何顺序访问XML元素。然而,对于大型文档来说,这样做可能不方便。因为它可能会用尽内存,或者当系统达到了它的极限时,机器的性能将会慢下来。,8.1 C#读写XML的几种方式,SAX提供了一种对XML文档进行顺序访问的模式,这是一种快速读写XML数据的方式。SAX接口是事件驱动的,当使用SAX分析器对XML文档进行分析时,就会触发一系列事件,并激活相应的事件处理函数,从而完成对XML文档的访问。SAX处理XML的方式与DOM不同。SAX解析器不是将DOM树解析和表现为输出,它是基于事件的,所以在XML被解析时,事件被发送给引擎。

6、SAX可以在文档的开始接收事件,也可以接收文档中的元素。使用这些事件可以构建一种结构。因为SAX没有把XML文档完全地加载到内存中,所以需要的系统资源较少,是一个分析大型XML文档的高效API。缺点是编写SAX比编写DOM复杂,这因为首先必须实现通知接口并维护状态,其次SAX不允许对文档进行随机访问,也没有提供像DOM那样的修改功能。,8.1 C#读写XML的几种方式,比较而言,DOM和SAX各有自己的应用场合。 DOM适用于处理下面的问题:解析比较小的XML文件;需要对文档进行修改;需要随机对文档进行访问。 SAX适于处理下面的问题:对大型文档进行处理;只需要文档的部分内容;只需要从文档中得

7、到特定信息。,8.1 C#读写XML的几种方式,在System.XML 名称空间中组织进了以下几个用于XML的类: XMLTextReader-提供以快速、单向、无缓冲的方式存取XML数据。(单向意味着你只能从前往后读取XML文件,而不能逆向读取) XMLValidatingReader-与XMLTextReader类一起使用,提供验证DTD、XDR和XSD架构的能力。 XMLDocument-遵循W3C文档对象模型规范的一级和二级标准,实现XML数据随机的、有缓存的存取。一级水平包含了DOM的最基本的部分,而二级水平增加多种改进,包括增加了对名称空间和级连状图表(CSS)的支持。 XMLTe

8、xtWriter-生成遵循 W3C XML 1.0 规范的XML文件。,8.2 DOM,DOM的全称是Document Object Model(文档对象模型),它是来自W3C的官方标准,它允许按照W3C标准W3C DOM Level1和W3C DOM Level2的规范所定义的规则,通过编程来读取,操纵和修改XML文档。DOM的工作方式是:首先将XML文档一次性的装入内存,然后根据文档中定义的元素和属性在内存中创建一个“树型结构”也就是一个文档对象模型,这里的含义其实是把文档对象化,文档中每个节点对应着模型中一个对象,而我们都知道对象提供编程接口,所以在Application中我们正是使用这

9、组对象来访问XML文档进而操作XML文档,,8.2 DOM,下图阐述了Application和DOM交互的过程:,8.2 DOM,DOM既然是在内存中创建树型结构视图进而提供编程接口,那我们就以下面这个XML片段来说明DOM是如何创建树型结构的: parent child id=”123”text here/child /parent,8.2 DOM,如果用DOM加载以上文档,它将在内存中创建的树型结构如下图:,8.2 DOM,.NET DOM的继承结构:,8.2 DOM,8.2 DOM,用C#来处理DOM主要的几个步骤如下: 一、先声明一XmlDocument对象并装载XML文件或片段; X

10、mlDocument doc=new XmlDocument(); -不要忘记了导入System.Xml哦 doc.load(“test.xml“); -doc.loadXml(“abc“);,8.2 DOM,二、再声明一XmlElement变量对象并用 doc.DocumentElement来赋值(得到XML文件的根元素不是根节点) XmlElement root=doc.DocumentElement();,8.2 DOM,三、查找节点再进行相应的操作: 1) 查找单个节点可有两种方法,一种是:用Get系列方法,如GetFirstChild(),另一种方法是SelectSingleNode

11、(“相应的XPath字符串”); 2) 也可查找节点集有两个对象XmlNodeList与XmlNamedNodeMap,共五种方法:前者用得比较多,而后者是处理无序节点集多处理Xml片段,8.2 DOM,/方法一 /XmlNodeList el=n.ChildNodes; 得到n的所有子节点集 /方法二 /XmlNodeList el=n.SelectNodes(“book“); /方法三 /XmlElement rootEle=doc.DocumentElement; /XmlNodeList el=rootEle.GetElementsByTagName(“book“); /方法四 /Xm

12、lNodeList el=doc.GetElementsByTagName(“book“); /方法五 /略,8.2 DOM,3)、可用以下三种方法来循环处理节点集 方法一: foreach(XmlElement ele in el) MessageBox.Show(ele.OuterXml); 方法二: for(int i=0;iel.count;i+) MessageBox.Show(eli.OuterXml); ,8.2 DOM,方法三: System.Collections.IEnumerator IE=doc.GetElementsByTagName(“book”).GetEnume

13、rator(); -由上面的GetEnumerator(); 返回 Collections.IEnumerator 对象 XmlElement CurrentElement; while(IE.MoveNext() CurrentElement=(XmlElement)IE.Current;-此处要把类型为object的Current转为Xmlelement MessageBox.Show(CurrentElement.OuterXml); ,8.2 DOM,四、创建新节点 主要的步骤如下: 1) 用XmlDocument对象并用XML填充其 2) 确定要插入的位置并定位到此位置 3) 创建节

14、点(其实也可为:Element、Attribute、Text、Comment、CDATA或Processing ),8.2 DOM,(一):创建元素节点 XmlElement elem=doc.CreateElement(“price“); XmlElement(对象).InnerText(); XmlNode(对象).CreateTextNode(); (二):为元素节点设置属性 SetAttribute()此方法是有则改,无则创. (三):创建其他类型的节点 XmlDocument.CreateComment()方法进行注释节点 XmlDocument.CreateCDataSection

15、() XmlDocument.CreateProcessingInstruction(),8.2 DOM,五、修改和删除节点 ReplaceChild(); SetAttribute(); RemoveChild(); RemoveAttribute(); RemoveAll();,8.2 DOM,六、加载和保存XML文档 使用Load()方法和Save()方法来对XML文档进行加载和保存,这个功能的代码如下所示: xmlDocument.Load( XMLFileName ); xmlDocument.Save( XMLFileName );,8.2 DOM,/ using System.X

16、ml; / private void button1_Click(object sender, EventArgs e) XmlDocument XMLDom = new XmlDocument(); XMLDom.Load(“http:/ XmlNodeList newXMLNodes = XMLDom.SelectNodes(“/rss/channel/item“); foreach (XmlNode xn in newXMLNodes) string title = xn.SelectSingleNode(“title“).InnerXml; MessageBox.Show(title)

17、; ,8.2 DOM,本节例子中的相应程序的运行界面,在这个程序中,用户可以增加、删除和修改数据库中职员的信息。,8.2 DOM,XmlNode类: 该类是DOM中所有其他节点的抽象基类,它定义所有在更低级的类中继承或重写的成员。它表示XML文档中的单一节点,它提供了用于导航DOM树型结构的基本方法和属性,使用XmlNodeType枚举器可以枚举其下的所有节点类型。以下介绍该类的部分属性和方法:,8.2 DOM,属性: public virtual bool HasChildNodes get; 获取一个值,该值指示当前节点是否有任何子节点 public virtual XmlNodeList

18、 ChildNodes get; 获取当前节点的所有子节点 public virtual XmlNode FirstChild get; 获取当前节点的第一个子级 public virtual XmlNode LastChild get; 获取当前节点的最后一个子级,8.2 DOM,public virtual XmlNode ParentNode get; 获取当前节点的父级 public virtual XmlNode NextSibling get; 获取当前节点的下一个兄弟节点 public virtual XmlNode PreviousSibling get; 获取当前节点的上一个

19、兄弟节点 public virtual string InnerText get; set; 获取或设置当前节点及其所有子节点的文本内容的串联值 public virtual string InnerXml get; set; 获取或设置仅代表当前节点的子节点的标记 public virtual string OuterXml get; 获取表示当前节点及其所有子节点的标记,8.2 DOM,方法: public XmlNodeList SelectNodes(string); 选择文档中匹配 XPath 表达式的节点列表 public XmlNode SelectSingleNode(stri

20、ng); 选择文档中匹配 XPath 表达式的第一个 XmlNode public virtual XmlNode AppendChild(XmlNode newChild) 将指定的节点添加到该节点的子节点列表的末尾,8.2 DOM,public virtual XmlNode PrependChild(XmlNode newChild) 将指定的节点添加到该节点的子节点列表的开头 public virtual XmlNode RemoveChild(XmlNode oldChild) 移除指定的子节点 public virtual XmlNode ReplaceChild(XmlNode

21、newChild,XmlNode oldChild) 用 newChild 节点替换子节点 oldChild,8.2 DOM,XmlDocument类: XmlDocument类是XML文档的.NET表示形式,它代表了内存中树型结构的文档节点(所有的节点都在文档节点下),XmlDocument类包含所有的CreateXXX()方法,这些方法允许创建所有派生自XmlNode的类型的节点,通常将该类与XmlNode类一起使用以完成对文档的操作,该类有一个Load()方法用于加载XML文档,该方法的一个重载版本允许从XmlTextReader加载文档,这给我们带来的好处是在操作较大的文档时我们可以先

22、使用XmlTextReader过滤不相关的文档部分,这样即解决了DOM所带来的资源损耗问题又可以保留DOM对文档操控的便利性,该类的Save()方法用于保存文档。,8.3 流模型-XMLTextReader类,C#读取XML文档之XMLTextReader 类有一些构造程序来适应各种各样的情况,比如从一个已经存在的数据流或统一资源定位网址读取数据。最常见的是,你或许想从一个文件读取XML数据,那么也就有一个相应的构造程序来为此服务。 XMLTextReader myReader; myReader = New XMLTextReader(“c:datasales.XML“),8.3 流模型-X

23、MLTextReader类,创建一个称为Read()方法的循环,这个方法的返回值总是为真,直到到达文件的底部时,返回值才变为假。换句话说, 循环在文件的开始时启动并且读入所有的节点, 一次读入一个节点, 直到到达文件的结尾: While (myReader.Read() . / 在这里处理每个节点. . ,8.3 流模型-XMLTextReader类,每次成功调用Read()之后,XMLTextReader实例化程序包含了目前节点(即刚刚从文件中读取的那个节点)的信息。我们可以从XMLTextReader的成员中获得上述信息,就像表格1中描述的一样;并通过NodeType属性判断出当前节点的类

24、型。在节点类型的基础上,程序的代码可以读取节点数据,检查它是否有属性,到底是忽略它还是根据程序需要进行相应的操作和处理。,8.3 流模型-XMLTextReader类,当使用NodeType属性时,理解节点怎么联系到XML单元是非常重要的。例如, 看下列 XML元素: cityChongqing/city C#读取XML文档之XMLtextReader 把这个元素看作 3 个节点,顺序如下: 1city标签被读为类型 XMLNodeType.Element 节点,元素的名字“city”可从 XMLTextReader 的Name属性中获得。,8.3 流模型-XMLTextReader类,2文本

25、数据“Chongqing”被读为类型为XMLNodeType.Text的节点。数据“Chongqing ” 可从XMLTextReader 的Value属性中取得。 3/city标签被读为类型为XMLNodeType.EndElement 节点。同样,元素的名称“city”可从XMLTextReader的Name属性中获得。,8.3 流模型-XMLTextReader类,enum XmlNodeType XmlNodeType_None = 0, XmlNodeType_Element = 1, XmlNodeType_Attribute = 2, XmlNodeType_Text = 3,

26、XmlNodeType_CDATA = 4, XmlNodeType_ProcessingInstruction = 7, XmlNodeType_Comment = 8, XmlNodeType_DocumentType = 10, XmlNodeType_Whitespace = 13, XmlNodeType_EndElement = 15, XmlNodeType_XmlDeclaration = 17 ;,8.3 流模型-XMLTextReader类,8.3 流模型-XMLTextReader类,8.4 验证有效性-XmlValidatingReader,XmlTextReader

27、xTR = new XmlTextReader(“D:VCDevExamXMLEmployees.xml“); XmlValidatingReader v = new XmlValidatingReader(xTR); v.ValidationType = ValidationType.Schema; v.ValidationEventHandler+=new ValidationEventHandler(MyValidationEventHandler); while (v.Read() ,附:Java四种方式操作 xml,DOM|SAX|JDOM|DOM4J,?xml version=“1

28、.0“ encoding=“GB2312“? RESULT VALUE NOA1234/NO ADDR四川省XX县XX镇XX路X段XX号/ADDR /VALUE VALUE NOB1234/NO ADDR四川省XX市XX乡XX村XX组/ADDR /VALUE /RESULT,附:Java四种方式操作 xml,DOM|SAX|JDOM|DOM4J,1)DOM import java.io.*; import java.util.*; import org.w3c.dom.*; import javax.xml.parsers.*;,附:Java四种方式操作 xml,DOM|SAX|JDOM|DO

29、M4J,public class MyXMLReader public static void main(String arge) long lasting =System.currentTimeMillis(); try File f=new File(“data_10k.xml“); DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); Document doc = builder.parse(f);

30、 NodeList nl = doc.getElementsByTagName(“VALUE“); for (int i=0;inl.getLength();i+) System.out.print(“车牌号码:” + doc.getElementsByTagName(“NO“).item(i).getFirstChild().getNodeValue();,附:Java四种方式操作 xml,DOM|SAX|JDOM|DOM4J,System.out.println(“车主地址:” + doc.getElementsByTagName(“ADDR“).item(i).getFirstChild

31、().getNodeValue(); catch(Exception e) e.printStackTrace(); ,附:Java四种方式操作 xml,DOM|SAX|JDOM|DOM4J,2)SAX import org.xml.sax.*; import org.xml.sax.helpers.*; import javax.xml.parsers.*; public class MyXMLReader extends DefaultHandler java.util.Stack tags = new java.util.Stack(); public MyXMLReader() sup

32、er(); ,附:Java四种方式操作 xml,DOM|SAX|JDOM|DOM4J,public static void main(String args) long lasting = System.currentTimeMillis(); try SAXParserFactory sf = SAXParserFactory.newInstance(); SAXParser sp = sf.newSAXParser(); MyXMLReader reader = new MyXMLReader(); sp.parse(new InputSource(“data_10k.xml“), rea

33、der); catch (Exception e) e.printStackTrace(); ,附:Java四种方式操作 xml,DOM|SAX|JDOM|DOM4J,System.out.println(“运行时间:“ + (System.currentTimeMillis() - lasting) + “毫秒“); public void characters(char ch, int start, int length) throws SAXException String tag = (String) tags.peek(); if (tag.equals(“NO“) System.o

34、ut.print(“车牌号码:“ + new String(ch, start, length); if (tag.equals(“ADDR“) System.out.println(“地址:“ + new String(ch, start, length); public void startElement(String uri,String localName,String qName,Attributes attrs) tags.push(qName); ,附:Java四种方式操作 xml,DOM|SAX|JDOM|DOM4J,3) JDOM import java.io.*; impo

35、rt java.util.*; import org.jdom.*; import org.jdom.input.*;,附:Java四种方式操作 xml,DOM|SAX|JDOM|DOM4J,public class MyXMLReader public static void main(String arge) long lasting = System.currentTimeMillis(); try SAXBuilder builder = new SAXBuilder(); Document doc = builder.build(new File(“data_10k.xml“); E

36、lement foo = doc.getRootElement(); List allChildren = foo.getChildren();,附:Java四种方式操作 xml,DOM|SAX|JDOM|DOM4J,for(int i=0;iallChildren.size();i+) System.out.print(“车牌号码:” + (Element)allChildren.get(i).getChild(“NO“).getText(); System.out.println(“车主地址:” + (Element)allChildren.get(i).getChild(“ADDR“).

37、getText(); catch (Exception e) e.printStackTrace(); ,附:Java四种方式操作 xml,DOM|SAX|JDOM|DOM4J,4)DOM4J import java.io.*; import java.util.*; import org.dom4j.*; import org.dom4j.io.*;,附:Java四种方式操作 xml,DOM|SAX|JDOM|DOM4J,public class MyXMLReader public static void main(String arge) long lasting = System.cu

38、rrentTimeMillis(); try File f = new File(“data_10k.xml“); SAXReader reader = new SAXReader(); Document doc = reader.read(f); Element root = doc.getRootElement(); Element foo;,附:Java四种方式操作 xml,DOM|SAX|JDOM|DOM4J,for (Iterator i = root.elementIterator(“VALUE“); i.hasNext() foo = (Element) i.next(); System.out.print(“车牌号码:” + foo.elementText(“NO”); System.out.println(“车主地址:” + foo.elementText(“ADDR“); catch (Exception e) e.printStackTrace(); ,附:Java四种方式操作 xml,DOM|SAX|JDOM|DOM4J,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1