初學者在解析XML檔案的時候最容易遇到的問題恐怕就是XML的namespace了,本文旨在對namespace做一個簡要的介紹。
namespace的意義不需要多說,和C++,C#等高階語言一樣,XML同樣面臨大量檔案放在一起的時候變數重名的問題,所以要用namespace把名字相同意義不同的變數隔離開。本文著重討論namespace的解析方法。
以下是一個簡單的XML檔:
<root> <child id = ‘0’> hello world </child> <child id='1'> one </child> </root>登入後複製
這個例子裡面沒有namespace,大家初學XML時接觸的例子恐怕都是這樣的。這個例子具有誤導性,初學者解析出了hello world之後就興高采烈的拿同樣的程序去解析實際的XML文件,往往驛羽而歸。下面是一段豆瓣API回傳的XML檔
<?xml version="1.0" encoding="UTF-8"?> <entry xmlns="http://www.w3.org/2005/Atom" xmlns:db="http://www.douban.com/xmlns/" xmlns:gd="http://schemas.google.com/g/2005" xmlns:opensearch="http://a9.com/-/spec/opensearchrss/1.0/"> <id>http://api.douban.com/event/10069638</id> <title>Debugging the Web </title> <category scheme="http://www.douban.com/2007#kind" term="http://www.douban.com/2007#event.salon"/> <author> <link href="http://api.douban.com/people/1057620" rel="self"/> <link href="http://www.douban.com/people/aka/" rel="alternate"/> <link href="http://t.douban.com/icon/u1057620-16.jpg" rel="icon"/> name>胖胖的大头鱼</name> <uri>http://api.douban.com/people/1057620</uri> </author> <db:attribute name="invite_only">no</db:attribute>登入後複製
# 看到這麼多www就不想看直接跳過,然後看到熟悉的
這行沒看頭,看下面這裡
這麼說就比較清楚了,但那個http://www.w3.org/2005/Atom到底是個啥啊,連個簡稱都沒有。哎,意識到這個就對了,他的簡稱就是」」,空串。這東西稱為default namespace,那些看起來沒有前綴的都是在這個namespace下的。所以那個
那麼該如何解析呢?這裡提供一個範例程序,希望對大家有幫助。這個程式碼可以在WP7上運行。我還有一個版本用的XmlDocument,尼瑪WP7上木有這個類,坑爹的。 。 。
string file = @"C:\Users\v-menlin\Documents\Visual Studio 2010\Projects\test\test\test.xml"; XDocument doc = XDocument.Load( file ); //use following code to parse a string //XDocument doc = XDocument.Parse( string ); //对于XML文件中所有的没加类似db:这种的元素,用下列方法 XNamespace d = @"http://www.w3.org/2005/Atom"; foreach ( XElement element in doc.Descendants( d + "title" ) ) { Console.WriteLine( element.Value ); } //<author>下面包含了<link>,一下的例子还示例了如何读取属性。 foreach ( XElement element in doc.Descendants( d + "author" ) ) { foreach ( XElement inelement in element.Descendants( d + "link" ) ) { Console.WriteLine( inelement.Attribute( "href" ).Value ); Console.WriteLine( inelement.Attribute( "rel" ).Value ); } } Console.WriteLine(); //对于加了冒号前缀的元素,使用下列代码 XNamespace db = @"http://www.douban.com/xmlns/"; foreach ( XElement element in doc.Descendants( db + "attribute" ) ) { Console.WriteLine( element.Attribute( "name" ).Value ); Console.WriteLine( element.Value ); } //其实只是NameSpace的头部换了一下。 //下面列出其他几个常用头部,直接换用。 XNamespace gd = @"http://schemas.google.com/g/2005"; XNamespace opensearch = @"http://a9.com/-/spec/opensearchrss/1.0/";登入後複製
以上是XML解析中的namespace初步了解的詳細內容。更多資訊請關注PHP中文網其他相關文章!