为什么我的方法不能根据用户输入构建正确的XML查询?

时间:2018-11-22 09:35:52

标签: c# xml xpath web-scraping

我目前正在尝试从文本框中获取用户输入,并使用它来构建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 
    }

1 个答案:

答案 0 :(得分:0)

第一点:永远不要通过结合用户输入的字符串串联来构建查询。 Google进行“ SQL注入攻击”以找出原因(大多数文献使用SQL术语,但XPath具有完全相同的漏洞)。

如果您使用带有变量的表达式,例如//*[dataItemId = $userInput],则(a)可以防止注入攻击,(b)您不必担心在输入中转义特殊字符(例如撇号) ,并且(c)效率更高,因为您只需要编译一次XPath表达式。

唯一的困难是您需要在执行查询之前弄清楚如何为查询提供参数(即$userInput的值)。这取决于您的XPath处理器的API,而我对所使用的XPath处理器并不熟悉,因此您需要自己进行研究。