XPath не может определить имя класса, когда содержит возвращаемый символ - PullRequest
0 голосов
/ 05 июля 2019

У меня проблема с селектором XPath.Когда имя класса имеет возвращаемый символ (или может быть по другой причине!), Он не может выбрать узел по имени класса.Кто-нибудь может мне помочь?

var html = 
    @"<INPUT class=box value=John maxLength=16 size=16 name=user_name>
      <INPUT class='  
        box1' value=Tony maxLength=16 size=16 name=user_name>
        ";

    var htmlDoc = new HtmlDocument();
    htmlDoc.LoadHtml(html);

    var htmlNodes = 
        htmlDoc.DocumentNode.SelectNodes("//input[@class='box1']");
    Console.WriteLine(htmlNodes == null);

    htmlNodes = htmlDoc.DocumentNode.SelectNodes("//input[@class='box']");
    Console.WriteLine(htmlNodes == null);  

В первом входном теге имя класса находится в той же строке с классом, но во втором входном элементе имя класса находится ниже строки.

Результат первогоконсоль True , а для второго False

https://dotnetfiddle.net/HGP9H3

1 Ответ

1 голос
/ 06 июля 2019

Проблема в том, что @class значение box1 содержит разрыв строки и несколько пробелов. Так что проверка предиката в выражении

//input[@class='box1']

терпит неудачу, и вы получаете true для нулевой проверки.

У вас есть две возможности исправить это:

  1. Удалите все пробелы / разрывы строк с помощью normalize-space в предикате, например:

    //input[normalize-space(@class)='box1']
    
  2. Удалите разрыв строки из фрагмента HTML следующим образом:

    var html = 
      @"<INPUT class=box value=John maxLength=16 size=16 name=user_name>
        <INPUT class='box1' value=Tony maxLength=16 size=16 name=user_name>
    ";
    
...