2012-07-03 30 views
17

Tôi muốn thỉnh thoảng bỏ qua đặc tả dtd trong khi phân tích cú pháp tệp xml bằng Scala. Tôi biết rằng điều này có thể được thực hiện khá dễ dàng với giao diện java bằng cách thực hiệnBỏ qua đặc tả DTD trong scala

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 

dbf.setValidating(false); 
dbf.setFeature("http://xml.org/sax/features/namespaces", false); 
dbf.setFeature("http://xml.org/sax/features/validation", false); 
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false); 
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 

Tuy nhiên, tôi không chắc chắn cách thực hiện điều này dễ dàng với thư viện xml của Scala. Nếu có thể tôi muốn tiếp tục sử dụng thư viện scala xml vì nó tốt hơn đáng kể.

Cảm ơn trước!

Trả lời

11

Điều này làm việc cho tôi, nhưng nó phụ thuộc vào việc triển khai trình phân tích cú pháp XML.

import scala.xml.Elem 
import scala.xml.factory.XMLLoader 
import javax.xml.parsers.SAXParser 
object MyXML extends XMLLoader[Elem] { 
    override def parser: SAXParser = { 
    val f = javax.xml.parsers.SAXParserFactory.newInstance() 
    f.setNamespaceAware(false) 
    f.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); 
    f.newSAXParser() 
    } 
} 

Xem thêm this question, đó thực sự là câu hỏi của bạn nhưng được diễn đạt một cách thù địch.

+0

Tôi thích giải pháp này! Và wow, đó là một câu hỏi thực sự thù địch. – fozziethebeat

+6

Cách tiếp cận tốt đẹp, mặc dù tôi thấy điều này không hiệu quả với tôi, vì nó không thành công khi nó tìm thấy một DTD, thay vì bỏ qua nó (có thể phụ thuộc vào việc thực hiện, như bạn lưu ý). Tôi thấy rằng điều này đã làm các trick mặc dù: 'f.setValidating (false); f.setFeature ("http://apache.org/xml/features/nonvalidating/load-external-dtd", sai); ' –

+0

@strangefeatures Cảm ơn. đã giúp. – Jus12

1

Trước tiên, tôi không phải là chuyên gia về XML. Vì vậy, đây chỉ là một số đoán ...

val f = javax.xml.parsers.SAXParserFactory.newInstance() 
f.setValidating(false) 
val p = f.newSAXParser() 
val doc = xml.XML.withSAXParser(p).load(url) 
2

Câu trả lời đầu tiên không hoạt động khi chúng tôi có DOCTYPE không đúng trong tệp xml. Giải pháp của tôi là:

import scala.xml.Elem 
import scala.xml.factory.XMLLoader 
import javax.xml.parsers.SAXParser 
object XML extends XMLLoader[Elem] { 
    override def parser: SAXParser = { 
    val f = javax.xml.parsers.SAXParserFactory.newInstance() 
    f.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false); 
    f.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
    f.newSAXParser() 
    } 
} 
+0

Cảm ơn. Đây là câu trả lời đã sửa phiên bản cụ thể của vấn đề này. Đã chấp nhận cho tôi SAXParseExceptions với 'DOCTYPE không được phép khi tính năng" http://apache.org/xml/features/disallow-doctype-decl "được đặt thành true'. Tôi đoán là XML mà áp phích đang làm việc với không có khai báo DOCTYPE. Tôi đã có chúng, nhưng DTD không được cung cấp/không ở đúng nơi/không cần thiết. – AndrewO

Các vấn đề liên quan