Esempio di codice utilizzando HTMLAgilitypack per selezionare i nodi ASPX tramite xpath

html-agility-pack

Domanda

Vorrei scoprire perché il mio codice non funziona (o, ottenere un pezzo di codice di esempio funzionante )

Quello che sto cercando di fare è interrogare un file ASPX usando HTMLAgilityPack, con un'espressione XPATH

Questo è il codice, se inserisci // asp: content , hai 0 nodi (Form1.designer.cs omesso per chiarezza):

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

        }
    }
}

questo è l'aspx di test, per favore salvalo in un file e inserisci il suo percorso completo in 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);
            }

        }
    }
}

Nota:

  1. So che aggiungere lo spazio dei nomi http://www.w3.org/1999/xhtml/ non ha senso, si prega di avvisare il modo corretto di aggiungere lo spazio dei nomi
  2. Funziona quando l'input è // tr, // td ecc
  3. doc.DocumentNode.Descendants ("asp: Content") funziona, ma ho bisogno di accettare un XPath di input dell'utente, quindi non sarà considerato (lo stesso per LiNQ per XML)

Risposta accettata

Sfortunatamente, non ero in grado di far funzionare XmlNamespaceManager correttamente con HtmlAgilityPack. Ma puoi usare la funzione xpath name() per interrogare i nodi asp: -like. Vedere:

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

Ciò restituirà 2 asp:content nodi del asp:content dal tuo frammento.

Ma l'utilizzo di LINQ in XML è molto più semplice.




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché