XML解析中的namespace初探

2022-02-16 11:03:11 字數 2216 閱讀 5770

初學者在解析xml檔案的時候最容易遇到的問題恐怕就是xml的namespace了,本文旨在對namespace做乙個簡要的介紹。

namespace的意義無需多說,和c++,c#等高階語言一樣,xml同樣面臨大量檔案放在一起的時候變數重名的問題,所以要用namespace把名字相同意義不同的變數隔離開。本文著重討論namespace的解析方法。

以下是乙個簡單的xml檔案:

hello world

one

這個例子裡面沒有namespace,大家初學xml時接觸的例子恐怕都是這樣的。這種例子具有誤導性,初學者解析出了hello world之後就興高采烈的拿同樣的程式去解析實際的xml檔案,往往鎩羽而歸。下面是一段豆瓣api返回的xml檔案

<?xml version="1.0" encoding="utf-8"?>

" xmlns:db="" xmlns:gd="" xmlns:opensearch="">

debugging the web

" term=""/>

" rel="self"/>

" rel="alternate"/>

" rel="icon"/>

name>胖胖的大頭魚

no

看到這麼多www就不想看直接跳過,然後看到熟悉的, 果斷套用上面例子的程式,一執行卻啥都得不到,問題到底出在哪?c#提供一大堆的xml類,xdocument, xreader, xpath, xmldocument,是不是我現在用的這種類不給力啊,沒法確定只好亂試,一亂試一晚上就過去了。童鞋,我們還是靜下心來逐行看看吧。

<?xml version="1.0" encoding="utf-8"?>這行沒看頭,看下面這裡" ,xmlns就是xml namespace的意思,這坑爹的到底是個啥呢。再往後看,xmlns:db="" ,結合no這句話,可以理解了,db是乙個namespace的簡稱,方便寫在元素的名字前面,這樣和 , 就不一樣了。這種簡稱可以在乙個文件裡面區別變數,但是對大量的文件還是不行,所以namespace還有乙個全稱,就是這裡的。這個全稱其實寫什麼內容都行,對xml parser來說都是當做字串來處理的,但一來想名字比較麻煩,二來可以順道做個廣告,所以大家一般都用的**。parse的時候parser根據全稱來區別變數,所以就算兩個文件中都有,只要全稱不一樣,都沒有問題。

這麼說就比較清楚了,但那個到底是個啥啊,連個簡稱都沒有。哎,意識到這個就對了,他的簡稱就是」」,空串。這東西被稱為default namespace,那些看上去沒有字首的都是在這個namespace下的。所以那個不是裸的啊,人家其實是 <」」 : author> 所以裸的程式當然是解析不了的了。

那麼該如何解析呢?這裡提供乙個樣例程式,希望對大家有幫助。這個**可以在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 = @"";

foreach ( xelement element in doc.descendants( d + "title" ) )

//下面包含了,一下的例子還示例了如何讀取屬性。

foreach ( xelement element in doc.descendants( d + "author" ) )

}console.writeline();

//對於加了冒號字首的元素,使用下列**

xnamespace db = @"";

foreach ( xelement element in doc.descendants( db + "attribute" ) )

//其實只是namespace的頭部換了一下。

//下面列出其他幾個常用頭部,直接換用。

xnamespace gd = @"";

xnamespace opensearch = @"";

enum class的基於namespace的實現

之前實現的列舉類enum class雖然達到了當時期望的功能,但現在在用的時候出現了一些問題。比如新定義了乙個token的類,定義如下,class token token int tp,string tx int type const string text const friend ostream...

XML中DOCTYPE欄位的解析

dtd宣告始終以 doctype開頭,空一格後跟著文件根元素的名稱,如果是內部dtd,則再空一格出現,在中括號中是文件型別定義的內容.而對於外部dtd,則又分為私有dtd與公共dtd,私有dtd使用system表示,接著是外部dtd的url.而公共dtd則使用public,接著是dtd公共名稱,接著...

android中解析XML檔案

上面這個鏈結詳細介紹了幾種xml的解析方法以及原理。下面是實現思路 1.讀取xml檔案 2.獲取讀取事件,如果檔案結束,則停止解析 3.處理讀取事件 4.回到第二步。下面是實現過程 1.要解析的xml檔案內容 name jim age 123 gender male email mail hostn...