.net下对具有名称空间的XML使用XPath的方法

80酷酷网    80kuku.com

  xml

   这两天都在对一个其他公司提供的RSS接口进行编程,由于他们RSS提供的是1.0版本,其中的XML部分是有名称空间的,为此这一两天为了这个,摔了很多跟头,Unicode 编码的问题,XPath 的问题,XSLT 解析的问题。下面把这些问题的解决方法罗列出来,方便后来者。

        使用 XPath 的问题: 由于存在名称空间,你的XPath需要额外的通过 XmlNamespaceManager 类进行一些设置。这个方法是我在:http://www.error-bank.com/microsoft.public.dotnet.xml__35_R5x1v5$DHA.2040TK2MSFTNGP12.phx.gbl_Thread.aspx 看到的,那里对这个问题的解决是:

Oleg Tkachenko [XML MVP, XmlInsider]
http://blog.tkachenko.com

解决的。非常感谢他在那里回答,让我找到了解决方法。下面是我的一个示例代码:

string ww = "<item rdf:about=""http://ncsp.forum.nokia.com/download/?asset_id=10357""
xmlns:rdf=""http://www.w3.org/1999/02/22-rdf-syntax-ns#""
xmlns: dc=""http://purl.org/dc/elements/1.1/""
xmlns:ncsp=""http://ncsp.forum.nokia.com/"">
 <title>Advanced Audio Support v1.0</title>
<link>http://ncsp.forum.nokia.com/download/?asset_id=10357</link>
 <description>Media Server Audio Streaming plug-in installation file for Nokia 9200 Series Communicators. Deprecated - use the official audio stream plug-in instead, available from SDK v1.2 and later.</description>
 <dc:title xmlns: dc=""http://purl.org/dc/elements/1.1/"">Advanced Audio Support v1.0</dc:title>
 <dc:identifier xmlns: dc=""http://purl.org/dc/elements/1.1/"">10357</dc:identifier>
 <dc:language xmlns: dc=""http://purl.org/dc/elements/1.1/"">English</dc:language>
 <ncsp:filesize xmlns:ncsp=""http://ncsp.forum.nokia.com/"">7 kB</ncsp:filesize>
 <ncsp:class xmlns:ncsp=""http://ncsp.forum.nokia.com/"">Toolkit</ncsp:class>
</item>";
XmlReader read = new XmlTextReader(new StringReader(ww));
XPathDocument doc = new XPathDocument(read);
XPathNavigator nav = doc.CreateNavigator();
string strXPath = "/item/dc:identifier";
XPathExpression expr = nav.Compile(strXPath);
XmlNamespaceManager mngr = new XmlNamespaceManager(nav.NameTable);
mngr.AddNamespace("dc","http://purl.org/dc/elements/1.1/");
mngr.AddNamespace("ncsp","http://ncsp.forum.nokia.com/");
expr.SetContext(mngr);
XPathNodeIterator iter = nav.Select(expr);
string strVal = null;
if (iter.MoveNext()){
      strVal = iter.Current.Value;
}

XML+XSLT 解析的问题,出这个问题,最后发现是在XML的头上,多定义了一个名称空间造成的,删除这个名称空间就可以了。由于这些RSS,是其他公司提供的,害的我找自己的问题,找了很久。

 



分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: