سؤال

أحاول كتابة محلل SAX لوثيقة XHTML أقوم بتنزيلها من الويب. في البداية كنت أواجه مشكلة في إعلان DocType (اكتشفت من هنا أنه لأن W3C قد منعت عن قصد الوصول إلى DTD)، لكنني أصلحت ذلك مع:

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

ومع ذلك، الآن أعاني من مشكلة ثانية. يحمي Sax Parser استثناء عندما يصل إلى بعض JavaScript المضمنة في مستند XHTML:

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

على وجه التحديد يلقي المحللون خطأ بمجرد وصوله إلى &&، كما يتوقع مرجع كيان. الاستثناء الدقيق هو:

`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 وتجنب الخطأ المرجعي للكيان؟

هتافات،

بيت

هل كانت مفيدة؟

المحلول

HTML (x) تحاول التحليل غير صحيح XML (وإلا فلن تحصل على خطأ في تحليل ساكس). و، أمبير مزدوجة ("&&") يؤكد ذلك. وهذا يعني أنه من تلقاء نفسها، لا يمكنك استخدام استخدام محلل XML عادي لتحليل المستند.

هناك أدوات يمكنك استخدامها، مثل Tagsup, ، والتي ستولد أحداث SAX المناسبة (يمكنك استخدام رمز تحليل SAX / XML نفسه كما كان من قبل)، لكن Tagsoup ستعتني بإعادة تعيين أحداث HTML التي تشكلها بشكل سيئ إلى أحداث SAX / XML المناسبة.

نصائح أخرى

أعتقد أنك من المفترض أن تضع محتوى البرنامج النصي في قسم CDATA، على سبيل المثال http://www.w3schools.com/tags/tag_script.asp.as. يعطي المثال التالي:

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

Nekohtml من المحتمل أن يحل هذا لك أيضا، يمكنك استخدامه كقطع XMLReader.

إذا كنت تستخدم مرشح SAX، فقد تكون أيضا قادرا على إدراجها فعاليات CDATA بعد مواجهتك u003Cscript>, although that might be parser-dependent as not all parsers support the ميزات lexicalhandler.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top