Пример кода с помощью HTMLAgilitypack для выбора узлов ASPX по пути xpath

html-agility-pack

Вопрос

Я хотел бы узнать, почему мой код не работает (или получить часть рабочего кода примера)

То, что я пытаюсь сделать, - это запросить файл ASPX с помощью HTMLAgilityPack с помощью выражения XPATH

Это код, если вы введете // asp: content , вы получили 0 узлов (для ясности пропущено Form1.designer.cs):

using hap = HtmlAgilityPack;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Xml.Linq;
using System.Text;
using System.Windows.Forms;

namespace hap_shell
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            lbl_ErrMsg.Text = "";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                lbl_ErrMsg.Text = "";
                hap.HtmlDocument doc = new hap.HtmlDocument();
                hap.HtmlWeb hw = new hap.HtmlWeb();

                doc.Load(txt_FilePath.Text);

                var q = doc.DocumentNode.Descendants("asp:Content");
                var cnt = q.Count();
                var nodes = q.ToList();
                var nav = doc.CreateNavigator();
                System.Xml.XmlNamespaceManager mgr = new System.Xml.XmlNamespaceManager(nav.NameTable);
                mgr.AddNamespace("asp",  "http://www.w3.org/1999/xhtml/"); // "http://tempuri.org/foo");
                var selNodes =nav.Select(txt_xpath.Text, mgr);


                //var selNodes = doc.DocumentNode.SelectNodes(txt_xpath.Text);

                if (selNodes == null)
                {
                    lbl_ErrMsg.Text = "No nodes match your query.";
                }
                lbl_ErrMsg.Text = selNodes.Count.ToString() + " nodes selected";
            }
            catch (Exception ex)
            {
                lbl_ErrMsg.Text = (ex.Message);
            }

        }
    }
}

это тестовая версия aspx, пожалуйста, сохраните файл и введите полный путь к txt_FilePath:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="back_cal.aspx.cs" Inherits="EDP_SYS.back_cal" %>
    <asp:content id="Content1" contentplaceholderid="HeadContent" runat="server" >
        </asp:content>
        <asp:content id="Content2" contentplaceholderid="MainContent" runat="server">
         <table>

                <tr><td>
                <asp:button id="Button1" runat="server" text="Search"></asp:button></td></tr>

               </table> 
        </asp:content>

Заметка:

  1. Я знаю, что добавление пространства имен http://www.w3.org/1999/xhtml/ не имеет смысла, пожалуйста, сообщите правильный способ добавления пространства имен
  2. Он работает, когда input // tr, // td и т. Д.
  3. doc.DocumentNode.Descendants («asp: Content») работает, но мне нужно принять XPath с пользовательским входом, поэтому он не будет рассматриваться (то же самое для LiNQ для XML)

Принятый ответ

К сожалению, я не смог правильно XmlNamespaceManager с HtmlAgilityPack. Но вы можете использовать функцию xpath name() для запроса asp: -like узлов. Видеть:

var contentNodes = doc.DocumentNode.SelectNodes("//*[name()='asp:content']");

Это вернет 2 asp:content из вашего фрагмента.

Но использование LINQ to XML намного проще для этого.



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему