コードが機能しない理由を知りたい(または、機能するサンプルコードを入手する)
私がやろうとしているのは、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>
ノート:
- 名前空間http://www.w3.org/1999/xhtml/を追加しても意味がないことはわかっていますが、名前空間を追加する正しい方法を教えてください
- 入力が//tr、//tdなどの場合に機能します
- doc.DocumentNode.Descendants( "asp:Content")は機能しますが、ユーザー入力のXPathを受け入れる必要があるため、考慮されません(LiNQ for XMLでも同じです)。