2011-12-29 81 views
8

我有一个HTML文档,并使用XPath解析它。我想获得元素输入的值,但它不起作用。通过XPath和HtmlAgilityPack获取属性的值

我的HTML:

<tbody> 
    <tr> 
    <td> 
     <input type="text" name="item" value="10743" readonly="readonly" size="10"/> 
    </td> 
    </tr> 
</tbody> 

我的代码:

using HtmlAgilityPack; 

HtmlAgilityPack.HtmlDocument doc; 
HtmlWeb hw = new HtmlWeb(); 
HtmlNodeCollection node = doc.DocumentNode.SelectNodes("//input/@value"); 
string s=node[0].InnerText; 

所以我想要得到的值: “10743”(我不介意让与另一个标签回答。)

+0

你试过'node [0] .Value'吗? – Oded 2011-12-29 10:55:13

+0

不,因为我想通过'node [0] .InnerText' – 2011-12-29 10:59:05

+1

获取值但是一个属性没有'InnerText'。 – Oded 2011-12-29 12:16:31

回答

6

更新2:下面是一个代码示例如何使用Html Agility Pack获取属性值:

http://htmlagilitypack.codeplex.com/wikipage?title=Examples

HtmlDocument doc = new HtmlDocument(); 
doc.Load("file.htm"); 
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"]) 
{ 
    HtmlAttribute att = link.Attributes["href"]; 
    att.Value = FixLink(att); 
} 
doc.Save("file.htm"); 

你显然需要将此代码适应您的需求 - 比如你将不会修改属性,而只是用att.Value


更新:您也可以看看这个问题:

Selecting attribute values with html Agility Pack


你的问题很可能是默认命名空间问题 - 搜索“的XPath默认命名空间C#“,你会发现很多好的解决方案(提示:使用SelectNodes(),它有一个XmlNamespaceManager变元)。

下面的代码显示了一个获取对文档中的一个属性 “没有命名空间”:

using System; 
using System.IO; 
using System.Xml; 

public class Sample 
{ 

    public static void Main() 
    { 

     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml("<input value='novel' ISBN='1-861001-57-5'>" + 
        "<title>Pride And Prejudice</title>" + 
        "</input>"); 

     XmlNode root = doc.DocumentElement; 

     XmlNode value = doc.SelectNodes("//input/@value")[0]; 

     Console.WriteLine("Inner text: " + value.InnerText); 
     Console.WriteLine("InnerXml: " + value.InnerXml); 
     Console.WriteLine("OuterXml: " + value.OuterXml); 
     Console.WriteLine("Value: " + value.Value); 

    } 
} 

运行这个程序的结果是

Inner text: novel 
InnerXml: novel 
OuterXml: value="novel" 
Value: novel 

现在,对于处于默认命名空间的文档:

using System; 
using System.IO; 
using System.Xml; 

public class Sample 
{ 

    public static void Main() 
    { 

     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml("<input xmlns='some:Namespace' value='novel' ISBN='1-861001-57-5'>" + 
        "<title>Pride And Prejudice</title>" + 
        "</input>"); 

     XmlNode root = doc.DocumentElement; 

     XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); 
     nsmgr.AddNamespace("x", "some:Namespace"); 

     XmlNode value = doc.SelectNodes("//x:input/@value", nsmgr)[0]; 

     Console.WriteLine("Inner text: " + value.InnerText); 
     Console.WriteLine("InnerXml: " + value.InnerXml); 
     Console.WriteLine("OuterXml: " + value.OuterXml); 
     Console.WriteLine("Value: " + value.Value); 

    } 
} 

运行这个程序,再想要的结果生产:

Inner text: novel 
InnerXml: novel 
OuterXml: value="novel" 
Value: novel 
+0

谢谢,但这不是问题,我的文档是Html,另一个XPath doe很好,除此之外 - 因为这个XPath不适合我的意图。我需要找到另一个XPath,但我不知道。 – 2011-12-29 14:49:06

+0

我不是很清楚吗?无论如何,我添加**所有**我的代码,并写了我想要的:字符串:“** 10743 **”(节点输入的值) – 2011-12-29 16:18:05

+0

@Chanipoz:看看我的第二次更新 - 一个代码示例显示如何使用Html Agility Pack获取属性的价值 - 您可以轻松地适应您的需求。 – 2011-12-29 16:30:30

14

你可以得到它在.Attributes集合:

var doc = new HtmlAgilityPack.HtmlDocument(); 
doc.Load("file.html"); 
var node = doc.DocumentNode.SelectNodes("//input") [0]; 
var val = node.Attributes["value"].Value; //10743 
5

您也可以直接抢属性,如果你使用HtmlNavigator

//Load document from some html string 
HtmlDocument hdoc = new HtmlDocument(); 
hdoc.LoadHtml(htmlContent); 

//load navigator for current document 
HtmlNavigator navigator = (HtmlNodeNavigator)hdoc.CreateNavigator(); 

//Get value with given xpath 
string xpath = "//input/@value"; 
string val = navigator.SelectSingleNode(xpath).Value;