2

コードが機能しない理由を知りたい(または、機能するサンプルコードを入手する

私がやろうとしているのは、HTMLAgilityPackを使用してXPATH式でASPXファイルをクエリすることです。

これはコードです。//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. 入力が//tr、//tdなどの場合に機能します
  3. doc.DocumentNode.Descendants( "asp:Content")は機能しますが、ユーザー入力のXPathを受け入れる必要があるため、考慮されません(LiNQ for XMLでも同じです)。
4

1 に答える 1

8

XmlNamespaceManager残念ながら、 HtmlAgilityPackを適切に使用できませんでした。ただし、xpathname()関数を使用して、asp:ノードのようなクエリを実行できます。見る:

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

asp:contentこれにより、フラグメントから2つのノードが返されます。

ただし、これにはLINQtoXMLの使用がはるかに簡単です。

于 2012-11-27T13:35:05.990 に答える