溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

XML解析中namespace有什么用

發(fā)布時間:2021-09-17 14:12:38 來源:億速云 閱讀:140 作者:小新 欄目:編程語言

這篇文章主要介紹了XML解析中namespace有什么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

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

以下是一個簡單的XML文件:

<root>
   <child id = ‘0’> 
      hello world 
   </child>
   <child id='1'>
     one
   </child>
</root>

這個例子里面沒有namespace,大家初學(xué)XML時接觸的例子恐怕都是這樣的。這種例子具有誤導(dǎo)性,初學(xué)者解析出了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="https://cache.yisu.com/upload/information/20200318/103/25413.jpg" rel="icon"/>
    name>胖胖的大頭魚</name>    
    <uri>http://api.douban.com/people/1057620</uri>
    </author>
<db:attribute name="invite_only">no</db:attribute>

看到這么多www就不想看直接跳過,然后看到熟悉的<author> </author>, 果斷套用上面例子的程序,一運行卻啥都得不到,問題到底出在哪?C#提供一大堆的XML類,XDocument, XReader, XPath, XmlDocument,是不是我現(xiàn)在用的這種類不給力啊,沒法確定只好亂試,一亂試一晚上就過去了。童鞋,我們還是靜下心來逐行看看吧。

<?xml version="1.0" encoding="UTF-8"?>這行沒看頭,看下面這里<entry xmlns="http://www.w3.org/2005/Atom" ,xmlns就是xml namespace的意思,這坑爹的http://www.w3.org/2005/Atom到底是個啥呢。再往后看,xmlns:db="http://www.douban.com/xmlns/" ,結(jié)合<db:attribute name="invite_only">no</db:attribute>這句話,可以理解了,db是一個namespace的簡稱,方便寫在元素的名字前面,這樣<db:attribute> 和 <attribute>, <gd:attribute>就不一樣了。這種簡稱可以在一個文檔里面區(qū)別變量,但是對大量的文檔還是不行,所以namespace還有一個全稱,就是這里的http://www.douban.com/xmlns/。這個全稱其實寫什么內(nèi)容都行,對XML Parser來說都是當(dāng)做字符串來處理的,但一來想名字比較麻煩,二來可以順道做個廣告,所以大家一般都用的網(wǎng)址。Parse的時候Parser根據(jù)全稱來區(qū)別變量,所以就算兩個文檔中都有<db:attribute>,只要全稱不一樣,都沒有問題。

這么說就比較清楚了,但那個http://www.w3.org/2005/Atom到底是個啥啊,連個簡稱都沒有。哎,意識到這個就對了,他的簡稱就是””,空串。這東西被稱為default namespace,那些看上去沒有前綴的都是在這個namespace下的。所以那個<author>不是裸的啊,人家其實是 <”http://www.w3.org/2005/Atom” : author> 所以裸的程序當(dāng)然是解析不了的了。

那么該如何解析呢?這里提供一個樣例程序,希望對大家有幫助。這個代碼可以在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/";

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“XML解析中namespace有什么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI