가벼운 구문 분석 구현. 이 코드는 인터넷에서 정보를 다운로드하지 않으며 스크립트를 실행하지 않으며 순전히 구문 분석됩니다.
구문 분석은 MSHTML의 MarkupService를 통해 구현됩니다. 이 코드를 올바르게 사용하려면 MSHTML 참조를 추가해야합니다.
imperstrestreamint 인터페이스는 .NET에서 정의되지 않으므로 자체적으로 구현해야하며 인터페이스 정의는 다음과 같습니다.
다음 내용은 프로그램 코드입니다.
[comvisible (true), comimport (), Guid ( "7FD52380-4E07-101B-AE2D-08002B2C713"), InterfacetyPeatTribute (cominterfacetype.interfaceisiunknown)]
publicinterfaceipersiststreaminit
{
voidgetClassId ([in, out] refguidpclassid);
[반품 : Marshalas (UnmanagedType.i4)] [Preservesig]
intisdirty ();
voidload ([in, marshalas (unmanagedtype.interface)] ucomistreampstm);
voidSave ([in, arshalas (unmanagedtype.interface)] ucomistreampstm,
[in, Marshalas (UnmanagedType.i4)] intfcleardirty);
voidgetSizeMax ([out, Marshalas (unmanagedtype.lparray)] longpcbsize);
voidinitnew ();
}
다음 내용은 프로그램 코드입니다.
unsafeihtmldocument2parse (문자열)
{
ihtmldocument2pdocument = newhtmlDocumentClass ();
if (pdocument! = null)
{
iPersistStreamInitppersist = pdocumentAsipersistStreamInit;
ppsist.initnew ();
ppsist = null;
imakupservicesms = pdocumentasimarkupservices;
if (ms! = null)
{
immarkupcontainerpmc = null;
imarkuppointerpstart, pend;
Ms.createmarkuppointer (outpstart);
Ms.createmarkuppointer (Outpend);
StringBuildersB = NewstringBuilder (들);
intptrpsource = Marshal.stringtohglobaluni (s);
Ms.parsestring (ref*(ushort*) psource.topointer (), 0, outpmc, pstart, pend);
if (pmc! = null)
{
Marshal.Release (Psource);
returnpmcasihtmldocument2;
}
Marshal.Release (Psource);
}
}
returnnull;
}
코드를 작성할 때 뭔가 잘못되었습니다. MarkupService의 첫 번째 매개 변수 :: parsestring은 거부됩니다. 분명히, HTML 코드를 전달하려면이 Ushort는 첫 번째 WideChar 여야하므로 안전하지 않은 코드를 사용하여 컴파일러 경고를 우회합니다.