首頁  >  文章  >  後端開發  >  XML解析中的namespace初步了解

XML解析中的namespace初步了解

黄舟
黄舟原創
2017-03-17 17:32:531847瀏覽

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

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

以下是一個簡單的XML檔:

<root>
   <child id = ‘0’> 
      hello world 
   </child>
   <child id=&#39;1&#39;>
     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就不想看直接跳過,然後看到熟悉的48fe722b397613e801e59f453d6c9330 < ;/author>, 果斷套用上面例子的程序,一運行卻啥都得不到,問題到底出在哪? C#提供一大堆的XML類,XDocument, XReader, XPath, XmlDocument,是不是我現在用的這種類不給力啊,沒法確定只好亂試,一亂試一試晚上就過去了。童鞋,我們還是靜下心來逐行看看吧。

52b189f45abba88b2989c5c1f30b7a34這行沒看頭,看下面這裡552aa87c8aa3ee067aeb8be9fe305ebcnoea6f540cddccdca7d953c18eb1eb3288這句話,可以理解了,db是一個namespace的簡稱,方便寫在元素的名字前面,這樣5a37d16f53356ad61c30ba4c13522081 和e8aa4f7ce323535a9b01247c46fe6139, 02d8a117819869c76bcd3e50c8e21798就不一樣了。這種簡稱可以在一個文件裡面區別變量,但是對大量的文檔還是不行,所以namespace還有一個全名,就是這裡的http://www.douban.com/xmlns/。這個全稱其其實寫什麼內容都行,對XML Parser來說都是當做字符串來處理的,但一來想名字比較麻煩,二來可以順道做個廣告,所以大家一般都用的網址。 Parse的時候Parser根據全名來區別變量,所以就算兩個文檔中都有5a37d16f53356ad61c30ba4c13522081,只要全稱不一樣,都沒有問題。

這麼說就比較清楚了,但那個http://www.w3.org/2005/Atom到底是個啥啊,連個簡稱都沒有。哎,意識到這個就對了,他的簡稱就是」」,空串。這東西稱為default namespace,那些看起來沒有前綴的都是在這個namespace下的。所以那個48fe722b397613e801e59f453d6c9330不是裸的啊,人家其實是 ff0263bc51bb8a21b38871afee372a50 所以裸的程式當然是解析不了的了。

 

那麼該如何解析呢?這裡提供一個範例程序,希望對大家有幫助。這個程式碼可以在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn