문제

웹에서 다운로드 한 XHTML 문서에 대한 색소폰 파서를 작성하려고합니다. 처음에 나는 DocType 선언에 문제가있었습니다 (나는 여기 W3C가 의도적으로 DTD에 대한 액세스를 차단했기 때문 이었지만)

XMLReader reader = parser.getXMLReader();
reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);

그러나 지금은 두 번째 문제가 있습니다. Sax Parser는 XHTML 문서에 내장 된 JavaScript에 도달하면 예외를 던집니다.

    <script type="text/javascript" language="JavaScript">
function checkForm() {
answer = true;
if (siw && siw.selectingSomething)
    answer = false;
    return answer;
}//
</script>

구체적으로, 파서는 엔티티 참조를 기대하기 때문에 && s에 도달하면 오류를 일으킨다. 정확한 예외는 다음과 같습니다.

`org.xml.sax.SAXParseException: The entity name must immediately follow the '&' in the entity reference.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:391)
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1390)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEntityReference(XMLDocumentFragmentScannerImpl.java:1814)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3000)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:624)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:486)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:810)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:740)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:110)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1208)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:525)
at MLIAParser.readPage(MLIAParser.java:55)
at MLIAParser.main(MLIAParser.java:75)`

나는 DTD를 비활성화하지 않았다면이 오류가 발생하지 않을 것이라고 생각합니다. 그렇다면 DTD 오류를 피하고 엔티티 참조 오류를 피할 수있는 방법은 무엇입니까?

건배,

피트

도움이 되었습니까?

해결책

구문 분석하려는 (x) HTML은 유효한 XML이 아닙니다 (그렇지 않으면 SAX 구문 분석 오류가 발생하지 않습니다). 그리고, 이중 암호와 ( "&&")는 그것을 확인합니다. 즉, 자체적으로는 일반 XML 파서를 사용하여 문서를 구문 분석 할 수 없음을 의미합니다.

다음과 같이 사용할 수있는 도구가 있습니다 tagsoup, 적절한 색소폰 이벤트가 생성됩니다 (이전과 동일한 색소폰/XML 구문 분석 코드를 사용할 수 있지만 Tagsoup은 제대로 형성되지 않은 HTML 이벤트를 적절한 SAX/XML 이벤트에 매핑하는 것을 관리합니다.

다른 팁

예를 들어 스크립트 내용을 CDATA 섹션에 넣어야한다고 생각합니다. http://www.w3schools.com/tags/tag_script.asp 다음 예를 제시합니다.

<script type="text/javascript"><![CDATA[
document.write("Hello World!")
//]]></script>

Nekohtml 아마도 당신을 위해 이것을 고칠 것이고, 당신은 그것을 xmlreader로 사용합니다.

색소폰 필터를 사용하는 경우 삽입 할 수도 있습니다. CDATA 이벤트 당신이 시작한 후에 u003Cscript>, although that might be parser-dependent as not all parsers support the 어휘 핸들러 기능.

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