2013-12-13 1 views
0

이 코드를 사용하여이 xpath 쿼리를 HTMLAgilityPack과 함께 사용할 수없는 것처럼 보였습니다. 누구나 제안 사항이 있는지 궁금합니다.HTML 민첩성 팩이있는 하위 문자열이있는 최대 값

이것은 지금까지 가지고있는 쿼리이지만 숫자를 반환 할 수는 없습니다.

DocumentNode.GetAttributeValue("max(a[(@class='shackmsg')]/@href/substring-after(.,?id='))", ""); 

나는 shackmsg의 클래스 모든 hrefs= 로그인 후 href 속성에 MAX 값을 얻기 위해 노력하고있어.

How long is the beta live before it goes retail? No one knows. We do know t</span> : </a><span class="oneline_user ">legsbrogan</span> 
</div> 
</li> 
<li id="item_31218936" class=""> 
<div class="oneline oneline3 op olmod_ontopic olauthor_189801"> 
<a class="shackmsg" rel="nofollow" href="?id=31218936" onclick="return clickItem(31218933, 31218936);"><span class="oneline_body"><b><u><span class="jt_yellow">Current Multiplayer Servers</span>!</u></b> 
<span class="jt_sample"><span class="jt_green">Nighteyes's Japan Server: </span> <span class="jt_lime">(PvE)</span>: <b>211.15.2.34</b></span> 
<span class="jt_sample"><span class="jt_green">zolointo's Canada Server: </span> <span class="jt_lime">(</span></span></span> : </a><span class="oneline_user ">legsbrogan</span> 
</div> 
</li> 
<li id="item_31218938" class="last"> 
<div class="oneline oneline2 op olmod_ontopic olauthor_189801"> 
<div class="treecollapse"> 
    <a class="open" rel="nofollow" href="#" onclick="toggle_collapse(31218938); return false;" title="Toggle">toggle</a> 
</div> 
<a class="shackmsg" rel="nofollow" href="?id=31218938" onclick="return clickItem(31218933, 31218938);"><span class="oneline_body">Had fun freezing my ass off last night with a bunch of shackers. Not sure who started the big tower we f...</span> : </a><span class="oneline_user ">legsbrogan</span> 
</div> 
<ul> 
<li id="item_31218966" class=""> 
<div class="oneline oneline1 olmod_ontopic olauthor_128401"> 
<a class="shackmsg" rel="nofollow" href="?id=31218966" onclick="return clickItem(31218933, 31218966);"><span class="oneline_body">wasn't me. I hung out on my ship for a bit listening to your kid play Christmas songs for a bit and then ...</span> : </a><span class="oneline_user ">jonin</span><a class="lightningbolt" rel=\"nofollow\" href="http://www.shacknews.com/user/jonin/posts?result_sort=postdate_asc"><img src="http://cf.shacknews.com/images/bolt.gif" alt="This person is cool!" /></a> 
</div> 
</li> 
<li id="item_31219008" class="last"> 
<div class="oneline oneline0 olmod_ontopic olauthor_8618"> 
<a class="shackmsg" rel="nofollow" href="?id=31219008" onclick="return clickItem(31218933, 31219008);"><span class="oneline_body">haha i heard you guys booby trapped some poor sap's space ship</span> : </a><span class="oneline_user ">Break</span><a class="lightningbolt" rel=\"nofollow\" href="http://www.shacknews.com/user/Break/posts?result_sort=postdate_asc"><img src="http://cf.shacknews.com/images/bolt.gif" alt="This person is cool!" /></a> 
</div> 
</li> 
</ul> 

의견이 있으십니까?

+0

관찰중인 오류/예기치 않은 동작은 무엇입니까? – jessehouwing

+0

일치를 찾기 위해 값을 반환하지 않기 때문에 값을 반환합니다. – stonedonkey

+0

'GetAttributeValue'는 선택된 노드의 sinhe 속성에 대한 값을 얻으려고 시도합니다. 당신은'SelectSingleNode'을 시도한 다음 그 값을 얻었습니까? – jessehouwing

답변

0

는 멀리 볼 수있는 두 가지 문제가 있습니다

  • 당신은 현재의 상황에서 앵커 태그 만 스캔입니다. 당신은 아마 (쿼리의 시작 부분에 사용 //)를 사방 스캔 확장 할 : 나는 불필요한 괄호 한 쌍을 제거

    //a[@class='shackmsg']/@href/substring-after(., '?id=') 
    

    참고.

  • 완전히 실수가 아니라면 HTML 민첩성 팩은 XPath 1.0 만 지원합니다 (아직 완전히 확신 할 수는 없습니다). System.Xml.XPath은 XPath 2.0 데이터 모델을 구현한다고 말하면서 XPath 2.0을 실제로 구현하지는 않습니다 (아마도 타사 API가이 API를 구현하고 동시에 XPath 2.0/XQuery 지원을 제공 할 수 있기 때문일 수도 있습니다). 또한 this discussion on .NET's XPath 2.0 support을보십시오.

누락의 XPath 2.0을 지원하는 두 가지 문제로 표시합니다 :

  1. 기능 substring-after(...)가 존재하지 않습니다. 아직이 (문자 클래스 [?id=]의 모든 발행 수를 제거합니다

    translate('?id=31219008', '?id=', '') 
    

    :

    당신의 문제에 대한 해결책은 일부 문자를 제거하는 마지막 n 개의 숫자를 추출, 또는 translate(...)하는 string-lenght($string)substring($string, $start, $length)을 사용할 수 none, 그냥 강조하고 싶습니다 문자열과 일치하지 않지만이 세트의 개별 문자!).

  2. 축 단계에서 기능을 적용 할 수 없습니다. 즉, 하위 문자열의 최대 값을 찾을 수 없습니다.

    가능한 해결 방법 : 모든 하위 문자열을 가져 와서 XPath 외부에서 최대 값을 찾습니다.

0

당신은 HTML 민첩성 팩 XPath를 결합하여 다음과 같은 코드를 만들 수 있습니다

var value = doc.DocumentNode.SelectNodes("//a[@class='shackmsg']").Select(
        x => x.Attributes["href"].Value.Substring(4)).Max(); 

Console.WriteLine(value); 

그리고이 출력 : 나는 가정이 코드에서

31219008 

을에 항상 href 속성이 존재 항상 다음 구조를가집니다.