經(jīng)典問答
一.HTML已經(jīng)這樣流行了,為什么還要發(fā)展XML?
簡單地講,HTML不能完成,我們希望XML所要完成的任務(wù)。原因很簡單,XML所要完成的任務(wù),必須由元置標(biāo)語言來完成,而HTML只是一個實例置標(biāo)語言。 在XML發(fā)布之前,國際互聯(lián)網(wǎng)的發(fā)展受到HTML如下幾個問題的束縛:
1) HTML無法描述數(shù)據(jù)內(nèi)容,而這一點恰恰是數(shù)據(jù)檢索、電子商務(wù)所必須的。
2) HTML對數(shù)據(jù)表現(xiàn)的描述能力是十分不夠的,如HTML還不能描述矢量圖形、 科學(xué)符號等對象,目前只能通過圖象來表現(xiàn)這些對象。
3) HTML實例置標(biāo)語言的地位,完全不能適應(yīng)對新標(biāo)記需求的發(fā)展需要。
XML的出現(xiàn),使上述問題都得到很好的解決。
試想在互聯(lián)網(wǎng)世界,如果大家都講方言,互相交換信息時都要進行翻譯,那將是一個多么難以溝通和交流的世界。在互聯(lián)網(wǎng)世界,XML之所以重要,恰恰是由于它扮演了"國際語言"角色的緣故。此外,XML更為互聯(lián)網(wǎng)世界提供了定義各行各業(yè)的"專業(yè)術(shù)語"的工具。
二.如何在瀏覽器中閱讀XML?
閱讀XML文檔的工具一般稱為XML解析器, 也稱為XML處理器。 XML處理器將數(shù)據(jù)傳送到應(yīng)用軟件, 以便處理, 出版, 查詢, 或顯示。XML不給應(yīng)用軟件提供 應(yīng)用程序接口 (API), 它只是把數(shù)據(jù)傳給應(yīng)用軟件. XML處理器不解析非構(gòu)造良好的數(shù)據(jù)。 Netscape 和 Microsoft 都已經(jīng)將XML解析器包含在其瀏覽器中。 XML開發(fā)者團體提供免費的XML閱讀器和解析器, 以便在應(yīng)用軟件或XML制作軟件中進行應(yīng)用。
三.為什么要使用XML而不是HTML?
比較重要的原因有以下六條:
1)作者和供應(yīng)商能使用XML設(shè)計自己的文檔類型,不必被HTML所約束。
2)由于XML的超文本鏈接能力比HTML強得多,XML提供的信息內(nèi)容比 HTML更豐富,也更易于使用。
3)XML能提供更多更好的機制方便瀏覽器的信息表現(xiàn)和優(yōu)化性能。
4)XML舍棄了SGML的復(fù)雜性,因此編寫處理XML的應(yīng)用程序會很容易。
5)信息易于存儲,可重復(fù)使用。
6)XML文件在SGML環(huán)境中也可使用,不一定要局限于在WEB中使用。
四.可以用Java創(chuàng)建和管理XML文件嗎?
是的,任何程序設(shè)計語言都能被用來從XML形式的源文檔中輸出數(shù)據(jù)。已經(jīng)出現(xiàn)了許多的前端和后臺工具使得程序設(shè)計和數(shù)據(jù)管理更加方便。下面兩個網(wǎng)址有更加詳細的說明: http://www.markwatson.com/XMLdb_0_1.htm http://developerlife.com
五.為什么XML文件的分析結(jié)果出現(xiàn)亂碼?
這是由編碼問題引起的。XML標(biāo)準(zhǔn)規(guī)定,XML分析器必須支持“UTF-8”和“UTF-16”編碼,而且必須能夠自動區(qū)分這兩種編碼的文件,對于其他編碼(包括常用的中文編碼“GB2312”或“BIG5”)并不要求支持。如果XML文件中包含編碼聲明,分析器則按照聲明的編碼進行處理,否則就按照識別結(jié)果進行處理(識別的結(jié)果總是“UTF-8”和“UTF-16”中的一種)。因此,如果XML文件的編碼在這兩種之外,你必須在XML文件前加上編碼聲明,如:<?xml version="1.0" encoding="gb2312"?>就表示XML文件的編碼是“gb2312”。
現(xiàn)有的XML分析器大多不支持中文編碼“GB2312”或“BIG5”,因此無法讀取包含中文的XML文件。你可以使用支持中文編碼的分析器,如MSXML,IBMJAVA4C,IBMJAVA4J等進行XML分析。你也可以用內(nèi)碼轉(zhuǎn)換工具,將編碼轉(zhuǎn)換為“UTF-8”或“UTF-16”后進行解析,然后將解析結(jié)果轉(zhuǎn)換回原來的編碼。本站的軟件園地中的ccnv(Code Converter)就是這樣的工具。當(dāng)然,你也可以自己寫一個內(nèi)碼轉(zhuǎn)換程序。
關(guān)于“UTF-8”和“UTF-16”編碼的詳細信息,請查看本站標(biāo)準(zhǔn)薈萃中的UTF-16和UTF-8標(biāo)準(zhǔn)。
六.XML如何與數(shù)據(jù)庫連接?
XML是一種文件格式,它沒有規(guī)定與數(shù)據(jù)庫的連接方法,你需要用傳統(tǒng)的方法連接數(shù)據(jù)庫,進行數(shù)據(jù)庫查詢,然后將查詢結(jié)果轉(zhuǎn)化為XML格式?,F(xiàn)在有一些工具提供了XML與數(shù)據(jù)庫的連接過程大都遵循這樣的步驟。下面是一個利用ASP直接生成XML文件的例子,你可以訪問http://www.xml.net.cn/Asps/test/roster1.asp查看執(zhí)行效果。
<%@ language="VBScript" %>
<?xml version="1.0" encoding="gb2312"?>
<?xml:stylesheet type="text/xsl" href="..image oster.xsl"?>
<roster>
<%
set cConn = Server.CreateObject("ADODB.Connection")
call cConn.Open("DSN","USER", "PWD")
set rs = cConn.Execute("SELECT DISTINCT * FROM roster")
Do While Not rs.EOF %>
<Record>
<Name><%=trim(rs("name"))%></Name>
<NativePlace><%=trim(rs("NativePlace"))%></NativePlace>
<Age><%=trim(rs("Age"))%></Age>
<Telephone><%=trim(rs("Telephone"))%></Telephone>
</Record>
<% rs.MoveNext
Loop
rs.Close
set rs=nothing
set cConn=nothing
%>
</roster>
xml應(yīng)用實例
本文介紹3個XML的基本應(yīng)用實例,旨在帶領(lǐng)你快速步入XML編程世界。實例包括:在.NET中使用XML、讀取XML文件,插入數(shù)據(jù)到XML文檔中。
在.NET中使用XML
如果使用過MSXML3,那么在.NET應(yīng)用程序中使用XML將是一個相當(dāng)簡單的過程。即時沒有接觸過MSXML3,也不要緊,你會發(fā)現(xiàn)使用.NET平臺提供的相關(guān)類也是很容易的一件事情。
有兩種主要API可用于訪問建立在XML文檔中的數(shù)據(jù),它們包括只向前的無緩沖存取以及隨機存取,而且自始至終都使用到文檔對象模型DOM。有關(guān)這2個API的類位于System.XML集合中。
如果要快速有效地訪問XML文檔中的數(shù)據(jù),就需要使用XmlTextReader類。這個類采取“拉”模式處理方式,要比簡單XML API(SAX)中的“推”模式處理方式優(yōu)越許多。使用XmlTextReader類之前首先要引用System.Xml集合,在C#中是使用“using”關(guān)鍵字來引用,在Visual Basic中則是使用“imports”關(guān)鍵字。引用了集合后,就可以象下面的代碼所示開始例示讀操作了:
XmlTextReader reader = new XmlTextReader(pathToXmlDoc);
int elementCount = 0;
while (reader.Read()) {
if (reader.NodeType == XmlNodeType.Element) {
elementCount++;
}
}
XmlTextReader類中有幾個不同的構(gòu)造器,上面所示的負(fù)責(zé)接收一個XML文件的路徑作為字符串參數(shù)。
雖然只向前的“拉”模式處理相當(dāng)有效率,但它卻是只讀的,所以不能允許執(zhí)行插入、刪除或者更新XML文檔節(jié)點的操作。當(dāng)需要對XML文檔施加更多的控制并需要更大的靈活性時,我們可以看一看文檔對象模型DOM。DOM API的功能將XML文檔中的每一個節(jié)點裝載到一個樹形結(jié)構(gòu)中,看起來就象是一個“家譜”。內(nèi)存中有了這個結(jié)構(gòu),隨機存取XML文檔中的不同節(jié)點就變得可行。
開始創(chuàng)建DOM樹形結(jié)構(gòu)前,首先引用System.Xml集合,然后例示XmlDocument類:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(pathToXmlDoc);
XmlNode root = xmlDoc.DocumentElement;
通過使用XmlDocument類中的相關(guān)方法,在樹形結(jié)構(gòu)中添加節(jié)點的操作可以很容易地完成。下面的例子演示了如何從一個文件中裝載XML,然后在根節(jié)點root下添加一個子元素以及它的相關(guān)屬性:
XmlDocument xmlDoc = new XmlDocument();
XmlDoc.Load(pathToXmlDoc);
XmlElement root = xmlDoc.DocumentElement;
XmlElement newNode = doc.CreateElement("newNode");
newNode.SetAttribute("id","1");
root.AppendChild(newNode);
以上代碼執(zhí)行后,將產(chǎn)生下面的XML文檔:
<?xml version="1.0"?>
<root>
<newNode id="1"/>
</root>
當(dāng)需要將包含XML的字符串裝載進DOM中時,可以使用XmlDocument類的LoadXml()方法。裝載進去后,就可以按照下面的方式操作XML:
string myXml = "<root><someNode>Hello</someNode></root>";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(myXml);
//....manipulation or reading of the nodes can occur here
除了以上幾種,在System.Xml集合中還有多種其他類可用于執(zhí)行不同的任務(wù)。上面的介紹僅僅是淺嘗則止,大量的應(yīng)用還需要更多的練習(xí)。
讀取XML文件
下面介紹如何使用XmlTextReader類讀取XML文檔,并將數(shù)據(jù)顯示輸出。
System.XML名稱空間中定義了兩個類-XmlReader與XmlTextReader,其中XmlTextReader類來源于XmlReader類,而XmlTextReader類就可以用于讀取XML文檔,這個文檔的Read函數(shù)將讀取文檔內(nèi)容,直到節(jié)點尾部。
以下是具體的實現(xiàn)步驟:
1、引用名稱空間
因為相關(guān)XML的類是在System.XML名稱空間中定義的,所以第一件事情就是引用這個名稱空間:
using System.Xml;
2、打開XML文檔
XmlTextReader類的構(gòu)造器可用于打開一個XML文件。本例程的XML文件叫做xmltest.xml,位于C:\temp目錄下。打開文件c:\temp\xmltest.xml的命令如下:
XmlTextReader reader = new XmlTextReader("C:\\temp\\xmltest.xml");
3、讀取數(shù)據(jù)
讀取XML文件的數(shù)據(jù),可以使用XmlTextReader類的Read方法:
while ( reader.Read() )
{
Console.WriteLine(reader.Name);
}
4、完整執(zhí)行代碼readxml.cs
namespace WriteToXML
{
using System;
using System.Xml;
/// <summary>
/// Summary description for Class1.
/// </summary>
public class Class1
{
public Class1()
{
}
public static int Main(string[] args)
{
try
{
XmlTextWriter writer = new XmlTextWriter("C:\\temp\\xmltest.xml", null);
writer.WriteStartDocument();
writer.WriteComment("Commentss: XmlWriter Test Program");
writer.WriteProcessingInstruction("Instruction","Person Record");
writer.WriteStartElement("p", "person", "urn:person");
writer.WriteStartElement("LastName","");
writer.WriteString("Chand");
writer.WriteEndElement();
writer.WriteStartElement("FirstName","");
writer.WriteString("Chand");
writer.WriteEndElement();
writer.WriteElementInt16("age","", 25);
writer.WriteEndDocument();
}
catch (Exception e)
{
Console.WriteLine ("Exception: {0}", e.ToString());
}
return 0;
}
}
}
插入數(shù)據(jù)到XML文檔中
要實現(xiàn)將XML數(shù)據(jù)插入到一個現(xiàn)存文檔或者一個新文檔中的目的,可以使用XmlNode類和XmlDocument類。具體的實現(xiàn)步驟如下:
1、引用名稱空間
因為相關(guān)XML的類是在System.XML名稱空間中定義的,所以第一件事情就是引用這個名稱空間:
using System.Xml;
2、裝載XML到文檔中
我們可以使用XmlDocument的LoadXml方法將XML數(shù)據(jù)裝載到一個文檔中,或者是裝載一個現(xiàn)存的XML文檔。下面的代碼裝載XML數(shù)據(jù)到文檔中:
XmlDocument doc = new XmlDocument();
doc.LoadXml("<XMLFile>" +
" <SomeData>Old Data</SomeData>" +
"</XMLFile>");
3、插入XML數(shù)據(jù)
下面的代碼將XML數(shù)據(jù)插入到文件中,然后保存為InsertedDoc.xml:
try
{
XmlNode currNode;
XmlDocument doc = new XmlDocument();
doc.LoadXml("<XMLFile>" +
" <SomeData>Old Data</SomeData>" +
"</XMLFile>");
XmlDocumentFragment docFrag = doc.CreateDocumentFragment();
docFrag.InnerXml="<Inserted>" +
" <NewData>Inserted Data</NewData>" +
"</Inserted>";
// insert the availability node into the document
currNode = doc.DocumentElement.FirstChild;
currNode.InsertAfter(docFrag, currNode.LastChild);
//save the output to a file
doc.Save("InsertedDoc.xml");
}
catch (Exception e)
{
Console.WriteLine ("Exception: {0}", e.ToString());
}
代碼執(zhí)行后,新文檔的內(nèi)容如下:
- <XMLFile>
- <SomeData>
Old Data
- <Inserted>
<NewData>Inserted Data</NewData>
</Inserted>
</SomeData>
</XMLFile>(完)
xml的應(yīng)用是什么?xml到底能做什么?
首先說,xml的技術(shù)有兩項的很顯著的特點。
1,數(shù)據(jù)和現(xiàn)實的分離。
2,數(shù)據(jù)的自描述性。
下面我就從這兩個方面,結(jié)合自己的經(jīng)驗和叢書中了解的知識,簡單的談一下。
第一:數(shù)據(jù)和現(xiàn)實的分離。
比如說你手頭上有一篇的資料(我們這里先假定是文字的資料,因為如果涉及到圖,影像等范圍就太廣了,也不是我只能力所及),是xml的數(shù)據(jù)的格式,好了,如果你的客戶想通過互聯(lián)網(wǎng)看看你的資料。你就可以使用一個aaa.xsl把你的xml的數(shù)據(jù)格式化為HTML的格式,同時這里面有個補充一點,因為你可以控制你要顯示的內(nèi)容,你可以過濾掉對于客戶不能看到的信息。但是這里面你并沒有動原來的數(shù)據(jù)。
如果你的老板想把資料打印出來,作為報表向上級匯報,還是用原來的數(shù)據(jù),再寫一個bbb.xsl,把xml的數(shù)據(jù)輸出為一個漂亮的報表的形式。ok了。
如果你以前的數(shù)據(jù)是txt的格式,你就必須從新的要做兩種的格式,
一個html的,一個報表的。你的工作最多時copy,copy的
2,數(shù)據(jù)的自描述性。
比如說我的個人信息。
對于數(shù)據(jù)庫來說,可能建立一個users的表。建立不同的字段。
數(shù)據(jù)取得可以是
rs("name")="jiangtianpeng"
rs("Emial")="wfxian@263.net"
rs("Id")="dadapeng"
但是沒有了rs或者對于外部來說又如何的區(qū)分id和name的區(qū)別。
dadapeng是id?還是name?
jiangtianpeng是name?還是id?
ok
用xml描述一下個人信息
<person>
<name>jiangtianpeng</name>
<id>dadapeng</id>
<natio>china</nation>
....
<email>wfxian@263.net</email>
</person>
是不是一目了然。
實際上面的問題就涉及到了不同系統(tǒng)之間的xml的交換。xml是不同系統(tǒng)之間的橋梁。
我談一下我工作的xml經(jīng)驗
我現(xiàn)在的工作是一個中文,英文,俄文三種語言的網(wǎng)站,
比如我們通過com組件的得到一個用戶的信息
可能是
<user id='feiddd' name_CN="王" name_EN="ddddf"
name_RU='這里是俄文' 。。。。等等的信息 />
在中文上就寫一個顯示中文的xsl,
在英文上就寫一個顯示英文信息的xsl。
如果不用這種技術(shù),將會很麻煩的。
相關(guān)文章