Html Agility Pack을 사용하여 특정 위치에서 HTML 선택

c# html html-agility-pack xpath

문제

html 텍스트 노드를 얻으려고합니다. 라인 64, 라인 위치 45, 라인 183, 라인 위치 22입니다. XPath에 익숙하지 않아, 어떤 옵션이 있는지 잘 모르겠습니다. 어떻게해야합니까? 나는 다음과 같은 것을 염두에 두었다.

var nodes=doc.DocumentNode.SelectNodes("//text()[position() > startPosition and position() < endPosition]");

수락 된 답변

HtmlNode 클래스에는 두 가지 중요한 속성이있다.

  • Line (노드가 시작되는 선)
  • LinePosition (노드가 끝나는 행)

당신은 다음과 같이 할 수 있습니다 :

var nodes = doc.DocumentNode.Descendants("#text").Where(
    x => (x.Line > 64 || (x.Line == 64 && x.LinePosition >= 45)) &&
         (x.Line < 183 || (x.Line == 183 && x.LinePosition <= 22))
);

물론 doc.DocumentNode.SelectNodes("//text()").Where(...) 를 사용할 수도 있습니다 doc.DocumentNode.SelectNodes("//text()").Where(...)

처리해야 할 한 가지 문제는 다음과 같습니다.

위의 해법은 노드가 끝나는 곳을 알려주지 않으므로 183 이나 183 보다 큰 위치에서 끝나는 노드는 22 보다 큰 위치에 놓이게됩니다. 이를 위해 노드의 OuterHtml 속성을 사용하고 일부 문자열 조작을 수행 할 수 있습니다 (길이가 어디서 끝나는 지 알 수 있고 \n 만큼 여러 줄을 알 수 있습니다).


인기 답변

XPath에서는이 작업을 수행 할 수 없습니다. XML 내에서 줄 번호와 문자 위치는 알지 못합니다.

position() 함수는 노드 목록에서 노드의 상대 위치를 반환합니다. 예를 들어 목록의 첫 번째 노드에 대해 1을 반환하고 두 번째 노드에 대해 2를 반환합니다.

줄 위치 정보를 얻으려면 XElement 또는 XmlReader 를 사용하여 XML을 구문 분석 한 다음 IXmlLineInfo 인터페이스를 사용할 수 있습니다.

XML 파일의 조각을 식별하기 위해 줄 / 문자 위치를 사용하는 것은 문제가됩니다. 즉, XML 처리기는 XML의 형식을 다시 지정하고 공백과 끝 줄을 추가 / 제거하므로 동일한 XML 조각이 위치를 변경할 수 있습니다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.