我目前正在尝试从文本框中获取用户输入,并使用它来构建XML查询。
查询应在文档中搜索具有给定属性'dataItemId'的元素,并返回innerText
值。
在try{}
语句中注释掉的两行代码按预期工作,返回正确的值,但是当我尝试使用以上两行并在输入框中键入“ Xabs”时,我得到:
结果查询XPath:// * [dataItemId ='Xabs'] 找不到项目。“
这必须与字符串的解析方式有关,但我对此深感困惑。
public void MazakButton_Click(object sender, EventArgs e)
{
string userInput = searchInput.Text;
ResultBox.Items.Clear();
string query = "No Query Found";
string searchResult = "No Items Found";
if (userInput.Length > 3)// If query paramater is long enough
{
//string Query = "\"//*[dataItemId = '" + userInput + "']\""; // Build Attribite Query
query = "//*[dataItemId = '" + userInput + "']"; // Build Attribite Query
XmlDocument MTData = MTFunctions.ScrapeXMLData(MazakSourceURL, false);
try
{
XmlNode target = MTData.SelectSingleNode(query);
searchResult = userInput + ": " + target.InnerText;
//XmlNode target = MTData.SelectSingleNode("//*[@dataItemId = 'Xabs']");
//searchResult = target.InnerText;
}
catch
{
Console.WriteLine("!!!!!!!!!!!!!!! - XML SEARCH FAILED - !!!!!!!!!!!!!!!");
}
}
else{searchResult = "Invalid request (Too short)";}
searchInput.Focus();
ResultBox.Items.Add("Your Resultant Query XPath: " + query);
ResultBox.Items.Add(searchResult);
searchInput.Text = string.Empty; // Clear searchInput
}
答案 0 :(得分:0)
第一点:永远不要通过结合用户输入的字符串串联来构建查询。 Google进行“ SQL注入攻击”以找出原因(大多数文献使用SQL术语,但XPath具有完全相同的漏洞)。
如果您使用带有变量的表达式,例如//*[dataItemId = $userInput]
,则(a)可以防止注入攻击,(b)您不必担心在输入中转义特殊字符(例如撇号) ,并且(c)效率更高,因为您只需要编译一次XPath表达式。
唯一的困难是您需要在执行查询之前弄清楚如何为查询提供参数(即$userInput
的值)。这取决于您的XPath处理器的API,而我对所使用的XPath处理器并不熟悉,因此您需要自己进行研究。