日期:2014-04-13 浏览次数:21184 次
这两天都在对一个其他公司提供的RSS接口进行编程,由于他们RSS提供的是1.0版本,其中的XML部分是有名称空间的,为此这一两天为了这个,摔了很多跟头,Unicode 编码的问题,XPath 的问题,XSLT 解析的问题。下面把这些问题的处理方法罗列出来,方便后来者。
使用 XPath 的问题: 由于存在名称空间,你的XPath需求额外的通过 XmlNamespaceManager 类进行一些设置。这个方法是我在:http://www.error-bank.com/microsoft.public.dotnet.xml__35_R5x1v5$DHA.2040@TK2MSFTNGP12.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,是其他公司提供的,害的我找本人的问题,找了很久。