初学者在解析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中文网其他相关文章!