在.NET中使用XPath查找指定元素时遇到的麻烦(以dataConfiguration.config为例)

XPath查找XML元素及.NET使用问题
博客介绍了XPath查找特定XML元素或结点的方法,如查找book、price等元素。还展示了.NET下使用XPath的示例代码。同时分享了使用XPath从dataConfiguration.config文件获取数据库连接串时遇到的问题,发现是名称空间导致查找失败,并给出正确代码。

XPath提供了一种方便的途径来供我们查找特定的XML元素或结点,以如下的XML片段为例:

None.gif < catalog >
None.gif
< book  id ="bk101" >
None.gif
< author > Gambardella, Matthew </ author >  
None.gif
< title > XML Developer's Guide </ title >  
None.gif
< genre > Computer </ genre >  
None.gif
< price > 44.95 </ price >  
None.gif
< publish_date > 2000-10-01 </ publish_date >  
None.gif
< description > An in-depth look at creating applications with XML. </ description >  
None.gif
</ book >
None.gif
< book  id ="bk102" >
None.gif
< author > Ralls, Kim </ author >  
None.gif
< title > Midnight Rain </ title >  
None.gif
< genre > Fantasy </ genre >  
None.gif
< price > 5.95 </ price >  
None.gif
< publish_date > 2000-12-16 </ publish_date >  
None.gif
< description > A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world. </ description >  
None.gif
</ book >
None.gif
< book  id ="bk103" >
None.gif
< author > Corets, Eva </ author >  
None.gif
< title > Maeve Ascendant </ title >  
None.gif
< genre > Fantasy </ genre >  
None.gif
< price > 5.95 </ price >  
None.gif
< publish_date > 2000-11-17 </ publish_date >  
None.gif
< description > After the collapse of a nanotechnology society in England, the young survivors lay the foundation for a new society. </ description >  
None.gif
</ book >
None.gif
< book  id ="bk104" >
None.gif
< author > Corets, Eva </ author >  
None.gif
< title > Oberon's Legacy </ title >  
None.gif
< genre > Fantasy </ genre >  
None.gif
< price > 5.95 </ price >  
None.gif
< publish_date > 2001-03-10 </ publish_date >  
None.gif
< description > In post-apocalypse England, the mysterious agent known only as Oberon helps to create a new life for the inhabitants of London. Sequel to Maeve Ascendant. </ description >  
None.gif
</ book >
None.gif
</ catalog >


1,查找所有book元素://book
2,查找id="bk104"的book元素://book[@id="bk104"]
3,查找书名为Midnight Rain的book元素://book[title="Midnight Rain"]
4,查找值为44.95的price元素://book/price[.="44.95"]
5,查找值为"bk104"的id属性://book/@id[.="bk104"]

在.NET下使用XPath也非常方便,见如下示例代码:
XmlDocument doc = new XmlDocument();
doc.Load("book.xml");
XmlNode price = doc.SelectSingleNode("//book/price[.="44.95"]")

但前两天在使用XPath从dataConfiguration.config文件中获取数据库连接串时遇到了不少麻烦,dataConfiguration.config文件内容如下:

None.gif <? xml version="1.0" encoding="utf-8" ?>
None.gif
< dataConfiguration >
None.gif  
< xmlSerializerSection  type ="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" >
None.gif    
< enterpriseLibrary .databaseSettings xmlns:xsd ="http://www.w3.org/2001/XMLSchema"  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"  defaultInstance ="InstanceWebinpuy"  xmlns ="http://www.microsoft.com/practices/enterpriselibrary/08-31-2004/data" >
None.gif      
< databaseTypes >
None.gif        
< databaseType  name ="Sql Server"  type ="Microsoft.Practices.EnterpriseLibrary.Data.Sql.SqlDatabase, Microsoft.Practices.EnterpriseLibrary.Data, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"   />
None.gif      
</ databaseTypes >
None.gif      
< instances >
None.gif        
< instance  name ="InstanceWebinpuy"  type ="Sql Server"  connectionString ="Sql Connection String"   />
None.gif      
</ instances >
None.gif      
< connectionStrings >
None.gif        
< connectionString  name ="Sql Connection String" >
None.gif          
< parameters >
None.gif            
< parameter  name ="database"  value ="BMS_Webinput"  isSensitive ="false"   />
None.gif            
< parameter  name ="Integrated Security"  value ="False"  isSensitive ="false"   />
None.gif            
< parameter  name ="server"  value ="192.168.1.28"  isSensitive ="false"   />
None.gif          
</ parameters >
None.gif        
</ connectionString >
None.gif      
</ connectionStrings >
None.gif    
</ enterpriseLibrary.databaseSettings >
None.gif  
</ xmlSerializerSection >
None.gif
</ dataConfiguration >

现在要从此文件中获取parameter[@name='database']的元素,使用如上的示例代码却不能找到想要的parameter元素。经过长时间的摸索调查,终于发现问题出在enterpriseLibrary.databaseSettings元素上,刚开始以为是该元素中间的“."所致,后经验证在元素中出现“."不会引起查找问题,最后发现该元素后附加了几个名称空间,问题就出在这里,在元素中有如下的名称空间:xmlns="http://www.microsoft.com/practices/enterpriselibrary/08-31-2004/data",这句话就暗示该元素的默认名称是:http://www.microsoft.com/practices/enterpriselibrary/08-31-2004/data,该元素及其所有该元素的子元素都属该名称空间管辖,该元素及其所有子元素的全称就是:名称空间:元素名称。所以在查找的XPath语句中只指定元素名称而不指定名称空间前缀是不能找到特定元素的。正确的代码如下:

None.gif XmlDocument doc  =   new  XmlDocument();
None.gif            doc.Load(
" dataConfiguration.config " );
None.gif
None.gif            
// Create an XmlNamespaceManager for resolving namespaces.
None.gif
            XmlNamespaceManager nsmgr  =   new  XmlNamespaceManager(doc.NameTable);
None.gif            nsmgr.AddNamespace(
" MDAB " " http://www.microsoft.com/practices/enterpriselibrary/08-31-2004/data " );
None.gif
None.gif            XmlNode nodeServer 
=  doc.SelectSingleNode( " //MDAB:parameters/MDAB:parameter[@name='server'] " , nsmgr);
None.gif            
if (nodeServer  !=   null   &&  nodeServer.Attributes[ " value " ] != null )
None.gif            m_DbServer 
=  nodeServer.Attributes[ " value " ].Value;


 

转载于:https://www.cnblogs.com/zengdj/archive/2005/07/21/197503.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值