내가 질문에 언급 한 것을 성취하는 방법을 알 수 없기 때문에 필사적이다. 나는 이미 비슷한 예를 많이 읽었지만 정확한 상황에서 작동하는 것을 찾지 못했습니다. 그래서, 다음 코드를 가지고 있다고 가정 해 봅시다 :
<table><tr>
<td><a href="url-a">text A</a></td><td><a>id A</a></td><td><a>img A</a></td>
<td><a href="url-b">text B</a></td><td><a>id B</a></td><td><a>img B</a></td>
<td><a href="url-c">text C</a></td><td><a>id C</a></td><td><a>img C</a></td>
</tr></table>
자, 제가 이미 가지고있는 것은 url-a의 일부입니다. 기본적으로 ID A와 img A를 얻는 방법을 알고 싶습니다. XPath로 "찾기"위해 노력하고 있지만 제대로 작동 할 수는 없습니다. 또한 정보가 전혀 존재하지 않을 수도 있습니다. 이것은 최근의 시도입니다 (진지하게, 나는 여러 가지 방법을 시도하면서 3 시간 이상 동안이 문제를 해결했습니다).
if (htmlDoc.DocumentNode.SelectSingleNode(@"/a[contains(@href, 'part-url-a')]") != null)
string ida = htmlDoc.DocumentNode.SelectSingleNode(@"/a[contains(@href, 'part-url-a')]/following-sibling::a").InnerText;
글쎄, 그것은 분명히 지옥으로 잘못되어 누군가가 나를 도울 수 있다면 매우 기뻐할 것입니다. 또한 누군가가 나를 XPath 및 표기법 / 구문을이 예제와 함께 자세히 설명하는 일부 웹 사이트로 안내 할 수 있으면 감사하겠습니다. 책도 환영합니다.
추신 : XPath 없이는 C #에서 Regex 또는 간단한 StreamReader로 내 목표를 달성 할 수 있다는 것을 알고 각 라인에 필요한 내용이 포함되어 있는지 확인하지만 a) 코드가 갑작스러운 줄 바꿈을 할 수 있기 때문에 너무 취약합니다. 그리고 b) 나는이 프로젝트에서 내가하고있는 일에 대해 XPath에 완전히 집착해야한다.
도와 주셔서 미리 감사드립니다.
다음 XPath 표현식을 사용하십시오 .
/*/tr/td[a[@href='url-a']]
/following-sibling::td[1]
/a/text()
제공된 (기형이지만 수정 된) XML 문서에 대해 평가할 때 :
<table><tr>
<td><a href="url-a">text A</a></td><td><a>id A</a></td><td><a>img A</a></td>
<td><a href="url-b">text B</a></td><td><a>id B</a></td><td><a>img B</a></td>
<td><a href="url-c">text C</a></td><td><a>id C</a></td><td><a>img C</a></td>
</tr></table>
원하는 텍스트 노드가 선택됩니다 .
id A
마찬가지로이 XPath 표현식은 다음과 같습니다.
/*/tr/td[a[@href='url-a']]
/following-sibling::td[2]
/a/text()
동일한 XML 문서 (위)에 대해 평가할 때 다른 원하는 텍스트 노드를 선택합니다 .
img A
XSLT 기반 검증 :
이 변환이 XML 문서 (위) 에 적용될 때 :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/tr/td[a[@href='url-a']]
/following-sibling::td[1]
/a/text()"/>
<xsl:text> </xsl:text>
<xsl:copy-of select=
"/*/tr/td[a[@href='url-a']]
/following-sibling::td[2]
/a/text()"/>
</xsl:template>
</xsl:stylesheet>
원하는 결과가 생성됩니다 .
id A
img A
일치하지 않는 닫기 td
태그가있는 HTML이 심각하게 손상되었습니다. 제발 그들을 고쳐주세요. 그것은이 마크 업의 추악한 그림입니다.
이것은 Html Agility Pack이 당신이 그것에 던지는 쓰레기를 다룰 수 있기를 바란다. 그래서 여기에 당신이 가지고있는 쓰레기를 분석하고 id
와 img
값을 href
주어진 방법을 찾아 보자.
class Program
{
static void Main()
{
var doc = new HtmlDocument();
doc.Load("test.html");
var anchor = doc.DocumentNode.SelectSingleNode("//a[contains(@href, 'url-a')]");
if (anchor != null)
{
var id = anchor.ParentNode.SelectSingleNode("following-sibling::td/a");
if (id != null)
{
Console.WriteLine(id.InnerHtml);
var img = id.ParentNode.SelectSingleNode("following-sibling::td/a");
if (img != null)
{
Console.WriteLine(img.InnerHtml);
}
}
}
}
}