2012-10-10 2 views
0

나는다른 숨겨진 범위를 포함하는 범위에서 내부 텍스트를 가져 오는 방법?

<!DOCTYPE html> 
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta charset="utf-8" /> 
    <title>Page for test</title> 
</head> 
<body> 
    <div class="r_tr"> 
     <span class="r_rs">Inner text<span class="otherSpan" style="display: none">text</span></span> 
    </div> 
</body> 
</html> 

내가 "내부 텍스트"를 얻으려면 몇 가지 테스트 HTML 페이지를 가지고있다. HtmlAgilityPack을 사용하고 있습니다. 나는이 방법

public string GetInnerTextFromSpan(HtmlDocument doc) 
{ 
    const string rowXPath = "//*[@class=\"r_tr\"]"; 
    const string spanXPath = "//*[@class=\"r_rs\"]"; 
    string text = null; 
    HtmlNodeCollection rows = doc.DocumentNode.SelectNodes(rowXPath); 
    foreach(HtmlNode row in rows) 
    { 
     text = row.SelectSingleNode(spanXPath).InnerText; 
     Console.WriteLine("textL {0}", text); 
    } 
    return text; 

} 

하지만이 방법의 반환 "내부 textText 텍스트"를 작성합니다. 내가

[Test] 
public void TestGetInnerTextFromSpan() 
{ 
    var client = new PromtTranslatorClient(); 
    var doc = new HtmlDocument(); 
    doc.Load(@"testPage.html"); 
    var text = client.GetInnerTextFromSpan(doc); 
    StringAssert.AreEqualIgnoringCase("Inner text", text); 
} 

내 문제를 설명하고

Expected string length 10 but was 14. Strings differ at index 10. 
    Expected: "Inner text", ignoring case 
    But was: "Inner texttext" 
    ---------------------^ 

답변

2

내가 XPath를 알고 있지만 여기에 LINQ를 사용하는 솔루션입니다하지 않습니다

String inner = (from x in doc.DocumentNode.Descendants() 
       where x.Name == "span" 
       && x.Attributes["class"].Value == "r_rs" 
       select 
         (from y in x.ChildNodes 
         where y.Name == "#text" 
         select y.InnerText).FirstOrDefault() 
       ).FirstOrDefault(); 
1

첫 번째 결과에 대한 몇 가지 단위 테스트를 작성, 당신의 spanXPath이 올바르지 않습니다. //은 "루트에서 시작"을 의미하므로 row.SelectSingleNode(spanXPath)은 행에없는 문서에 항상 r_rs 클래스의 첫 번째 요소를 제공합니다. 이 문제를 해결하려면 //을 삭제하십시오.

그런 다음 text()은 텍스트 노드의 XPath입니다. 당신이 선택한 기간에 첫 번째 텍스트 노드를 얻을 수 있도록 foreach 루프에서

var span = row.SelectSingleNode(spanXPath); 
var textNode = span.SelectSingleNode("text()"); 
text = textNode.InnerText; 
Console.WriteLine("textL {0}", text); 

를 사용할 수 있습니다.

+0

결과는 내가 그것은 당신이 전체 문서의 첫 번째'r_rs' 요소를 선택했다 밝혀 "\ r에 \ n" – BILL

+0

이며, 전체 문서에서 첫 번째 텍스트 노드를 선택했습니다 -이 문제를 해결하기 위해 내 대답을 우습게 보았습니다. – Rawling

관련 문제