Codebeispiel mit HTMLAgilitypack zum Auswählen von ASPX-Knoten mit xpath

html-agility-pack

Frage

Ich möchte herausfinden, warum mein Code nicht funktioniert (oder ein Stück funktionierenden Beispielcode erhalten)

Was ich versuche, ist, eine ASPX-Datei mit dem HTMLAgilityPack durch einen XPATH-Ausdruck abzufragen

Dies ist der Code, wenn Sie // asp: content eingeben, haben Sie 0 Knoten (Form1.designer.cs aus Gründen der Übersichtlichkeit weggelassen):

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

        }
    }
}

Dies ist das Testaspx, bitte speichern Sie es in eine Datei und geben Sie den vollständigen Pfad zu txt_FilePath ein:

<%@ 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>

Hinweis:

  1. Ich weiß, dass das Hinzufügen des Namensraums http://www.w3.org/1999/xhtml/ keinen Sinn ergibt. Bitte geben Sie an, wie Sie den Namespace korrekt hinzufügen
  2. Es funktioniert, wenn die Eingabe // tr, // td etc ist
  3. doc.DocumentNode.Descendants ("asp: Content") funktioniert, aber ich muss einen Benutzer-Eingabe- XPath akzeptieren, also wird es nicht berücksichtigt (dasselbe gilt für LiNQ für XML)

Akzeptierte Antwort

Leider konnte ich den XmlNamespaceManager nicht ordnungsgemäß mit HtmlAgilityPack arbeiten lassen. Sie können jedoch die Funktion xpath name() verwenden, um asp: -like-Knoten abzufragen. Sehen:

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

Dadurch werden 2 asp:content Knoten von Ihrem Fragment zurückgegeben.

Die Verwendung von LINQ to XML ist jedoch wesentlich einfacher.




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum