Échantillon de code utilisant HTMLAgilitypack pour sélectionner les nœuds ASPX par xpath

html-agility-pack

Question

Je voudrais savoir pourquoi mon code ne fonctionne pas (ou, obtenir un morceau de code exemple de travail)

Ce que j'essaie de faire est d'interroger un fichier ASPX à l'aide de HTMLAgilityPack, par une expression XPATH.

Ceci est le code, si vous entrez // asp: content , vous avez 0 nœuds (Form1.designer.cs omis pour plus de clarté):

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);
            }

        }
    }
}

c'est l'aspx de test, sauvegardez s'il vous plaît dans un fichier et entrez son chemin complet vers txt_FilePath:

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);
            }

        }
    }
}

Remarque:

  1. Je sais que l'ajout de l'espace de noms http://www.w3.org/1999/xhtml/ n'a pas de sens, veuillez indiquer la méthode correcte pour ajouter l'espace de noms.
  2. Cela fonctionne quand l'entrée est // tr, // td etc
  3. doc.DocumentNode.Descendants ("asp: Content") fonctionne, mais je dois accepter un XPath d' entrée utilisateur, afin qu'il ne soit pas pris en compte (identique pour LiNQ pour XML).

Réponse acceptée

Malheureusement, je n'ai pas pu faire en XmlNamespaceManager que XmlNamespaceManager fonctionne correctement avec HtmlAgilityPack. Mais vous pouvez utiliser la fonction xpath name() pour interroger des nœuds asp: -like. Voir:

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

Cela renverra 2 nœuds asp:content de votre fragment.

Mais utiliser LINQ to XML est beaucoup plus facile pour cela.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi