C-Sharp function to escape single-quote on XPath expression

C#中,我们使用XPath 进行查询,比如:

string busname="Domino's Pizza";  
xoEle = (XmlElement)xoDoc.DocumentElement.SelectSingleNode("//Review[RestaurantName='" + busname + "']"); 
由于有单引号,而会导致异常发生。
为了避免这种情况发生,应该使用concat函数来处理'''
//Review[RestaurantName=concat("Domino","'","s Pizza")]  

对于单引号,替换为:" ' " ;对于双银号,替换为:' " '

 

因此:

 

//不能正确处理单引号,双银号同时存在的

private static string ParseXpathString(string input)  
{  
    string ret = "";  
    if (input.Contains("'"))  
    {  
        string[] inputstrs = input.Split('/'');  
        foreach (string inputstr in inputstrs)  
        {  
        if (ret != "")  
            ret += ",/"'/",";  
        ret += "/"" + inputstr + "/"";  
        }  
        ret = "concat(" + ret + ")";  
    }  
    else 
    {  
        ret = "'" + input + "'";  
    }  
    return ret;  
}

 

 

xoEle = (XmlElement)xoDoc.DocumentElement.SelectSingleNode("//Review[RestaurantName="+ ParseXpathString(busname) + "]");

 

 

// It seems good code.

/// <summary>
   
/// Returns a valid XPath statement to use for searching attribute values regardless of 's or "s
   
/// </summary>
   
/// <param name="attributeValue">Attribute value to parse</param>
   
/// <returns>Parsed attribute value in concat() if needed</returns>
   
public static string GetXpathStringForAttributeValue ( string attributeValue )
   
{
       
bool hasApos = attributeValue . Contains ( "'" );
       
bool hasQuote = attributeValue . Contains ( "/"" );

       
if (! hasApos )
       
{
           
return "'" + attributeValue + "'" ;
       
}
       
if (! hasQuote )
       
{
           
return "/"" + attributeValue + "/"" ;
       
}

       
StringBuilder result = new StringBuilder ( "concat(" );
       
StringBuilder currentArgument = new StringBuilder ();
       
for ( int pos = 0 ; pos < attributeValue . Length ; pos ++)
       
{
           
switch ( attributeValue [ pos ])
           
{
               
case '/'' :
                    result
. Append ( '/"' );
                    result
. Append ( currentArgument . ToString ());
                    result
. Append ( "'/"," );
                    currentArgument
. Length = 0 ;
                   
break ;
               
case '/"' :
                    result
. Append ( '/'' );
                    result
. Append ( currentArgument . ToString ());
                    result
. Append ( "/"/'," );
                    currentArgument
. Length = 0 ;
                   
break ;
               
default :
                    currentArgument
. Append ( attributeValue [ pos ]);
                   
break ;
           
}
       
}
       
if ( currentArgument . Length == 0 )
       
{
            result
[ result . Length - 1 ] = ')' ;
       
}
       
else
       
{
            result
. Append ( "'" );
            result
. Append ( currentArgument . ToString ());
            result
. Append ( "')" );
       
}
       
return result . ToString ();
   
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值