XML处理( XML Processing)
可扩展标记语言(XML)是一种非常类似于HTML或SGML的标记语言。 这是万维网联盟推荐的,可作为开放标准提供。
.Net Framework中的System.Xml命名空间包含用于处理XML文档的类。 以下是System.Xml命名空间中的一些常用类。
Sr.No. | 类和描述 |
---|---|
1 | XmlAttribute 表示属性。 属性的有效值和默认值在文档类型定义(DTD)或模式中定义。 |
2 | XmlCDataSection 表示CDATA部分。 |
3 | XmlCharacterData 提供几个类使用的文本操作方法。 |
4 | XmlComment 表示XML注释的内容。 |
5 | XmlConvert 对XML名称进行编码和解码,并提供在公共语言运行时类型和XML模式定义语言(XSD)类型之间进行转换的方法。 转换数据类型时,返回的值与语言环境无关。 |
6 | XmlDeclaration 表示XML声明节点。 |
7 | XmlDictionary 实现用于优化Windows Communication Foundation(WCF)的XML读取器/写入器实现的字典。 |
8 | XmlDictionaryReader Windows Communication Foundation(WCF)从XmlReader派生的抽象类,用于执行序列化和反序列化。 |
9 | XmlDictionaryWriter 表示Windows Communication Foundation(WCF)从XmlWriter派生以进行序列化和反序列化的抽象类。 |
10 | XmlDocument 表示XML文档。 |
11 | XmlDocumentFragment 表示一个对树插入操作很有用的轻量级对象。 |
12 | XmlDocumentType 表示文档类型声明。 |
13 | XmlElement 表示一个元素。 |
14 | XmlEntity 表示实体声明,例如。 |
15 | XmlEntityReference 表示实体引用节点。 |
16 | XmlException 返回有关上一个异常的详细信息。 |
17 | XmlImplementation 定义一组XmlDocument对象的上下文。 |
18 | XmlLinkedNode 获取紧邻此节点之前或之后的节点。 |
19 | XmlNode 表示XML文档中的单个节点。 |
20 | XmlNodeList 表示有序的节点集合。 |
21 | XmlNodeReader 表示一个读者,它在XmlNode中提供对XML数据的快速,非缓存前向访问。 |
22 | XmlNotation 表示符号声明,例如。 |
23 | XmlParserContext 提供XmlReader解析XML片段所需的所有上下文信息。 |
24 | XmlProcessingInstruction 表示处理指令,XML定义该处理指令以将特定于处理器的信息保留在文档的文本中。 |
25 | XmlQualifiedName 表示XML限定名称。 |
26 | XmlReader 表示提供对XML数据的快速,非缓存,仅向前访问的读者。 |
27 | XmlReaderSettings 指定一组要在Create方法创建的XmlReader对象上支持的功能。 |
28 | XmlResolver 解析由统一资源标识符(URI)命名的外部XML资源。 |
29 | XmlSecureResolver 通过包装XmlResolver对象并限制底层XmlResolver可以访问的资源,帮助保护XmlResolver的另一个实现。 |
30 | XmlSignificantWhitespace 表示混合内容节点中的标记或xml:space ='preserve'范围内的空格之间的空白。 这也称为重要的空白区域。 |
31 | XmlText 表示元素或属性的文本内容。 |
32 | XmlTextReader 表示提供对XML数据的快速,非缓存,仅向前访问的读者。 |
33 | XmlTextWriter 表示一个编写器,它提供快速,非缓存,仅向前生成包含XML数据的流或文件的方式,这些数据符合W3C可扩展标记语言(XML)1.0和XML建议中的命名空间。 |
34 | XmlUrlResolver 解析由统一资源标识符(URI)命名的外部XML资源。 |
35 | XmlWhitespace 表示元素内容中的空格。 |
36 | XmlWriter 表示一个编写器,它提供快速,非缓存,仅向前的方法来生成包含XML数据的流或文件。 |
37 | XmlWriterSettings 指定一组要在XmlWriter.Create方法创建的XmlWriter对象上支持的功能。 |
XML Parser API
XML数据的两个最基本和最广泛使用的API是SAX和DOM接口。
Simple API for XML (SAX) - 在这里,您为感兴趣的事件注册回调,然后让解析器继续处理文档。 当文档很大或存在内存限制时,这很有用,它会在从磁盘读取文件时解析文件,并且整个文件永远不会存储在内存中。
Document Object Model (DOM) API - 这是万维网联盟建议,其中整个文件被读入内存并以分层(基于树)的形式存储,以表示XML文档的所有功能。
在使用大文件时,SAX显然无法像DOM一样快地处理信息。 另一方面,独占使用DOM可以真正杀死你的资源,特别是如果用在很多小文件上。
SAX是只读的,而DOM允许更改XML文件。 由于这两种不同的API在字面上相互补充,因此没有理由不将它们用于大型项目。
对于我们所有的XML代码示例,让我们使用一个简单的XML文件movies.xml作为输入 -
<?xml version = "1.0"?>
<collection shelf = "New Arrivals">
<movie title = "Enemy Behind">
<type>War, Thriller</type>
<format>DVD</format>
<year>2003</year>
<rating>PG</rating>
<stars>10</stars>
<description>Talk about a US-Japan war</description>
</movie>
<movie title = "Transformers">
<type>Anime, Science Fiction</type>
<format>DVD</format>
<year>1989</year>
<rating>R</rating>
<stars>8</stars>
<description>A schientific fiction</description>
</movie>
<movie title = "Trigun">
<type>Anime, Action</type>
<format>DVD</format>
<episodes>4</episodes>
<rating>PG</rating>
<stars>10</stars>
<description>Vash the Stampede!</description>
</movie>
<movie title = "Ishtar">
<type>Comedy</type>
<format>VHS</format>
<rating>PG</rating>
<stars>2</stars>
<description>Viewable boredom</description>
</movie>
</collection>
使用SAX API解析XML
在SAX模型中,您使用XmlReader和XmlWriter类来处理XML数据。
XmlReader类用于以快速,仅向前和非高速缓存的方式读取XML数据。 它读取XML文档或流。
例子1 (Example 1)
此示例演示如何从文件movies.xml中读取XML数据。
采取以下步骤 -
将movies.xml文件添加到应用程序的bin\Debug文件夹中。
在Form1.vb文件中导入System.Xml命名空间。
在表单中添加标签并将其文本更改为“Movies Galore”。
添加三个列表框和三个按钮,以显示xml文件中电影的标题,类型和说明。
使用代码编辑器窗口添加以下代码。
Imports System.Xml
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Set the caption bar text of the form.
Me.Text = "iowiki.com"
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
ListBox1().Items.Clear()
Dim xr As XmlReader = XmlReader.Create("movies.xml")
Do While xr.Read()
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "movie" Then
ListBox1.Items.Add(xr.GetAttribute(0))
End If
Loop
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
ListBox2().Items.Clear()
Dim xr As XmlReader = XmlReader.Create("movies.xml")
Do While xr.Read()
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "type" Then
ListBox2.Items.Add(xr.ReadElementString)
Else
xr.Read()
End If
Loop
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
ListBox3().Items.Clear()
Dim xr As XmlReader = XmlReader.Create("movies.xml")
Do While xr.Read()
If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "description" Then
ListBox3.Items.Add(xr.ReadElementString)
Else
xr.Read()
End If
Loop
End Sub
End Class
使用Microsoft Visual Studio工具栏上的“ Start按钮执行并运行上述代码。 单击按钮将显示文件中电影的标题,类型和描述。
XmlWriter类用于将XML数据写入流,文件或TextWriter对象。 它也以前向,非缓存方式工作。
例子2 (Example 2)
让我们通过在运行时添加一些数据来创建XML文件。 采取以下步骤 -
在表单中添加WebBrowser控件和按钮控件。
将按钮的Text属性更改为Show Authors File。
在代码编辑器中添加以下代码。
Imports System.Xml
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Set the caption bar text of the form.
Me.Text = "iowiki.com"
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim xws As XmlWriterSettings = New XmlWriterSettings()
xws.Indent = True
xws.NewLineOnAttributes = True
Dim xw As XmlWriter = XmlWriter.Create("authors.xml", xws)
xw.WriteStartDocument()
xw.WriteStartElement("Authors")
xw.WriteStartElement("author")
xw.WriteAttributeString("code", "1")
xw.WriteElementString("fname", "Zara")
xw.WriteElementString("lname", "Ali")
xw.WriteEndElement()
xw.WriteStartElement("author")
xw.WriteAttributeString("code", "2")
xw.WriteElementString("fname", "Priya")
xw.WriteElementString("lname", "Sharma")
xw.WriteEndElement()
xw.WriteStartElement("author")
xw.WriteAttributeString("code", "3")
xw.WriteElementString("fname", "Anshuman")
xw.WriteElementString("lname", "Mohan")
xw.WriteEndElement()
xw.WriteStartElement("author")
xw.WriteAttributeString("code", "4")
xw.WriteElementString("fname", "Bibhuti")
xw.WriteElementString("lname", "Banerjee")
xw.WriteEndElement()
xw.WriteStartElement("author")
xw.WriteAttributeString("code", "5")
xw.WriteElementString("fname", "Riyan")
xw.WriteElementString("lname", "Sengupta")
xw.WriteEndElement()
xw.WriteEndElement()
xw.WriteEndDocument()
xw.Flush()
xw.Close()
WebBrowser1.Url = New Uri(AppDomain.CurrentDomain.BaseDirectory + "authors.xml")
End Sub
End Class
使用Microsoft Visual Studio工具栏上的“ Start按钮执行并运行上述代码。 单击“显示作者文件”将在Web浏览器上显示新创建的authors.xml文件。
使用DOM API解析XML
根据文档对象模型(DOM),XML文档由节点和节点的属性组成。 XmlDocument类用于实现.Net Framework的XML DOM解析器。 它还允许您通过插入,删除或更新文档中的数据来修改现有XML文档。
以下是XmlDocument类的一些常用方法 -
Sr.No. | 方法名称和描述 |
---|---|
1 | AppendChild 将指定节点添加到此节点的子节点列表的末尾。 |
2 | CreateAttribute(String) 使用指定的Name创建XmlAttribute。 |
3 | CreateComment 创建包含指定数据的XmlComment。 |
4 | CreateDefaultAttribute 使用指定的前缀,本地名称和名称空间URI创建默认属性。 |
5 | CreateElement(String) 创建具有指定名称的元素。 |
6 | CreateNode(String, String, String) 使用指定的节点类型,Name和NamespaceURI创建XmlNode。 |
7 | CreateNode(XmlNodeType, String, String) 使用指定的XmlNodeType,Name和NamespaceURI创建XmlNode。 |
8 | CreateNode(XmlNodeType, String, String, String) 使用指定的XmlNodeType,Prefix,Name和NamespaceURI创建XmlNode。 |
9 | CreateProcessingInstruction 使用指定的名称和数据创建XmlProcessingInstruction。 |
10 | CreateSignificantWhitespace 创建XmlSignificantWhitespace节点。 |
11 | CreateTextNode 使用指定的文本创建XmlText。 |
12 | CreateWhitespace 创建一个XmlWhitespace节点。 |
13 | CreateXmlDeclaration 使用指定的值创建XmlDeclaration节点。 |
14 | GetElementById 获取具有指定ID的XmlElement。 |
15 | GetElementsByTagName(String) 返回一个XmlNodeList,其中包含与指定Name匹配的所有后代元素的列表。 |
16 | GetElementsByTagName(String, String) 返回一个XmlNodeList,其中包含与指定的LocalName和NamespaceURI匹配的所有后代元素的列表。 |
17 | InsertAfter 在指定的引用节点之后立即插入指定的节点。 |
18 | InsertBefore 在指定的引用节点之前插入指定的节点。 |
19 | Load(Stream) 从指定的流加载XML文档。 |
20 | Load(String) 从指定的URL加载XML文档。 |
21 | Load(TextReader) 从指定的TextReader加载XML文档。 |
22 | Load(XmlReader) 从指定的XmlReader加载XML文档。 |
23 | LoadXml 从指定的字符串加载XML文档。 |
24 | PrependChild 将指定节点添加到此节点的子节点列表的开头。 |
25 | ReadNode 根据XmlReader中的信息创建XmlNode对象。 阅读器必须位于节点或属性上。 |
26 | RemoveAll 删除当前节点的所有子节点和/或属性。 |
27 | RemoveChild 删除指定的子节点。 |
28 | ReplaceChild 用newChild节点替换子节点oldChild。 |
29 | Save(Stream) 将XML文档保存到指定的流。 |
30 | Save(String) 将XML文档保存到指定的文件。 |
31 | Save(TextWriter) 将XML文档保存到指定的TextWriter。 |
32 | Save(XmlWriter) 将XML文档保存到指定的XmlWriter。 |
例子3 (Example 3)
在这个例子中,让我们在xml文档authors.xml中插入一些新节点,然后在列表框中显示所有作者的名字。
采取以下步骤 -
将authors.xml文件添加到应用程序的bin/Debug文件夹中(如果您尝试过最后一个示例,它应该在那里)
导入System.Xml命名空间
在窗体中添加一个列表框和一个按钮控件,并将按钮控件的text属性设置为Show Authors。
使用代码编辑器添加以下代码。
Imports System.Xml
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Set the caption bar text of the form.
Me.Text = "iowiki.com"
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
ListBox1.Items.Clear()
Dim xd As XmlDocument = New XmlDocument()
xd.Load("authors.xml")
Dim newAuthor As XmlElement = xd.CreateElement("author")
newAuthor.SetAttribute("code", "6")
Dim fn As XmlElement = xd.CreateElement("fname")
fn.InnerText = "Bikram"
newAuthor.AppendChild(fn)
Dim ln As XmlElement = xd.CreateElement("lname")
ln.InnerText = "Seth"
newAuthor.AppendChild(ln)
xd.DocumentElement.AppendChild(newAuthor)
Dim tr As XmlTextWriter = New XmlTextWriter("movies.xml", Nothing)
tr.Formatting = Formatting.Indented
xd.WriteContentTo(tr)
tr.Close()
Dim nl As XmlNodeList = xd.GetElementsByTagName("fname")
For Each node As XmlNode In nl
ListBox1.Items.Add(node.InnerText)
Next node
End Sub
End Class
使用Microsoft Visual Studio工具栏上的“ Start按钮执行并运行上述代码。 单击“显示作者”按钮将显示所有作者的名字,包括我们在运行时添加的名称。