2011-11-16 5 views
0

NekoHTML을 사용하여 HTML을 정리 한 다음 XOM으로 가져 와서 개체 모델을 얻습니다. 이 과정에서 어딘가에 코멘트가 빠져 나옵니다. 여기NekoHTML (또는 JTidy) + XOM으로 도망가 오는 댓글

// XOMSafeSAXParser is the Neko SAXParser extended to allow 
// XOM to set the (unnecessary in this case) features 
// external-general-entities and external-parameter-entities 
XMLReader reader = new XOMSafeSAXParser(); 

Builder xomBuilder = new Builder(reader); 
Reader input = ...; // file, resource, etc. 
Document doc = xomBuilder.build(input); 

Serializer s = new Serializer(System.out, "UTF-8"); 
s.setIndent(4); 
s.setMaxLength(200); 
s.write(doc); 
s.flush(); 

해당 출력이다 :

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<HTML lang="en"> 
    <HEAD> 
     <SCRIPT type="text/JavaScript"> &lt;!-- // Hide the JS startTimeout(6000000, "/"); // --&gt; </SCRIPT> 
    </HEAD> 
여기

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html lang="en"> 
<head> 
    <script type="text/JavaScript"> 
     <!-- // Hide the JS 
     startTimeout(6000000, "/"); 
     // --> 
    </script> 

코드이다 : 여기

는 (명료성을 위해 <head> 절단의 대부분) 입력 HTML의 중요한 예이다

XOM 문서에서 스크립트 요소를 추출하면 이미 SCRIPT 요소는 Text 노드를 자식으로 가지고 있는데, 이는 TextsComments의 시퀀스가 ​​아니기 때문에 나는 Serializer이 잘못되었다고 생각하지 않습니다.

이제는 줄 바꿈이 유지되는 것을 기대하지 않고 실제로 스크립트 태그를 꺼내 겠지만 다른 곳에서는 주석을 보존하고 싶거나 이스케이프 된 주석없이 텍스트를 가져올 수 있어야합니다.

아이디어가 있으십니까?


업데이트 : NekoHTML 몇 가지 태그를 엉망으로했다, 그래서 나는 JTidy로 전환, 그리고 내가 같은 문제가 있습니다. 흥미롭게도 헤더의 스크립트 태그에 대한 문제 일뿐입니다. 다른 의견도 괜찮습니다. 그리고 JTidy의 잘못은 의심스럽고 (희망적이고기도하는) 이상한 JavaScript 주석이 있습니다.

<script type="text/JavaScript"> // &lt;!-- // Hide the JS startTimeout(6000000, "/"); // --&gt; // </script> 

JTidy가 수행하는 작업은 <script> 내용을 CDATA로 변환하는 것처럼 보입니다. JTidy의 raw outputut를 stdout에 보내면 다음과 같이됩니다.

답변

0

좋습니다. 나는 적어도 JTidy 경우의 explanation을 발견하는 것 : '&', '<', ']]>''<' + '/' + Letter :

기본적인 문제는 해당 브라우저의 스크립트는 종종 특별한 XML을 문자를 포함 할 것이다. 이것들을 이스케이프 처리하여 XML 프로세서를 행복하게 만들면 스크립트가 손상됩니다. 합의 된 솔루션은 CDATA 섹션 내에 소스를 배치하는 것입니다. 이제 두 태그 모두에 대해이 작업이 수행됩니다. 지금까지 이렇게 좋습니다. 그러나 수많은 공개 문제와 의도하지 않은 가능한 결과가 있습니다. . ... 스크립트 소스는 자바 스크립트를 지원하지 않는 구형 브라우저의 구문 분석을 방지하기 위해 HTML 주석에 종종 포함됩니다.

HTML 덧글 일반적으로 괜찮습니다; <script> 태그 안에있는 HTML 주석은 CDATA로 바뀌었기 때문에 엉망이됩니다. XOM은 차례로 merges CDATA into Text입니다.

기술적으로 이것은 JTidy가 깨 졌음을 의미한다고 생각하지만, <script> 태그가 전혀 필요하지 않기 때문에 제 목적에는 충분합니다.

아직 누군가가 나를 넣는 해결책이 있다면, 나는 그것을 듣고 싶습니다.