XML 파일을 처리하는 동안 XML :: XPath가 DTD를 가져 오는 것을 방지하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/303510

  •  08-07-2019
  •  | 
  •  

문제

내 XML (a.xhtml) 이렇게 시작합니다

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
...

내 코드는 이렇게 시작됩니다

use XML::XPath;

use XML::XPath::XMLParser;

my $xp = XML::XPath->new(filename => "a.xhtml");

my $nodeset = $xp->find('/html/body//table'); 

매우 느리고 DTD를 얻는 데 많은 시간을 소비한다는 것이 밝혀졌습니다 (http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd).

Perl XML :: Family에서 HTTP 프록시 서버를 명시 적으로 선언 할 수있는 방법이 있습니까? 나는 원본을 수정하는 것을 싫어합니다 a.xhtml DTD의 로컬 사본이있는 것과 같은 문서.

도움이 되었습니까?

해결책

xml :: xpath는 xml :: parser를 기반으로합니다. XML :: Parser에는 LWP를 사용하여 외부 엔티티 (예 : DTD)를 해결하지 못하는 옵션이 있습니다. XML :: XPath를 사용하면 XML :: Parser OBJETC를 전달하여 구문 분석자로 사용할 수 있습니다.

그래서 당신은 이것을 쓸 수 있습니다 :

my $p = XML::Parser->new( NoLWP => 1);
my $xp= XML::XPath->new( parser => $p, filename => "a.xhtml");

이 경우 숫자를 제외한 모든 엔티티와 기본 엔티티 (>, <, &, '및 ")를 제외한 모든 엔티티를 잃게됩니다. 파서는 불만을 제기하지 않지만 조용히 사라질 것입니다 (테이블에 α를 포함시키고 인쇄하십시오. 예를 들어).

사실, 당신은 아마도 적극적으로 유지되지 않은 xml :: xpath를 사용해서는 안됩니다.

xml :: libxml을 사용해보십시오. libxml2를 설치하는 데 아무런 문제가 없다면 인터페이스는 xml :: xpath가 둘 다 DOM을 구현하므로 매우 유사합니다. XML :: LIBXML은 XML :: XPath보다 훨씬 강력하고 부팅하기가 더 빠릅니다. 국외 거주자/xml :: 파서 기반 모듈을 원한다면 XML :: Twig를 살펴 보겠습니다 (내가 모듈의 저자 인 죄송합니다). 또한 html/dodgy xhtml의 경우 html :: treebuilder를 사용할 수 있습니다. html :: treebuilder :: xpath (나도)를 추가하면 xpath를 지원합니다.

다른 팁

포넬의 반응은 여기서 옳은 것 같습니다. (www.w3.org는 각 쿼리에 응답하는 데 30 초가 걸리기 시작했으며 (포기하는 것이 아니라면), XML :: XPath가 전체 XHTML 세트를 검색 할 때…!) Mirod의 아이디어는 작동합니다. , 도:

use XML::XPath;
use XML::Catalog;

my $parser = new XML::Parser;
my $catalog_handler = new XML::Catalog("xhtml1-20020801/DTD/xhtml.soc")->get_handler($parser);
$parser->setHandlers("ExternEnt" => $catalog_handler);
my $xp = new XML::XPath(xml => $xml, parser => $parser);

"XML 선언 및 SGML 오픈 카탈로그와 함께"전체 DTD 파일 세트 세트 "사본을 추가하십시오.http://www.w3.org/tr/xhtml1/dtds.html⟩ 그리고 즐기십시오!

일반적으로 로컬을 설정하여 수행됩니다 XML 카탈로그.

LIBXML 기반 파서는이를 지원하므로 Mirod의 조언을 따르면 네트워크 액세스없이 지명 된 엔티티 및 검증 작업을받을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top