2012-07-03 25 views
17

Bazen Scala kullanarak bir xml dosyasını ayrıştırırken dtd belirtimini göz ardı etmek istiyorum. Bunun Ancak Scala'daki DTD belirtimini yok sayma

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); 

yaparak java arayüzü ile oldukça kolay yapılabileceğini biliyorum, Scala'nın xml kütüphanesi ile kolayca bunun nasıl emin değilim. Mümkünse, scala xml kütüphanesini önemli ölçüde daha iyi kullanmaya devam etmek isterim.

Şimdiden teşekkürler!

cevap

11

Bu benim için çalışır, ancak XML ayrıştırıcısının uygulanmasına bağlıdır.

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() 
    } 
} 

gerçekten bir soru ama düşmanca bir şekilde ifadeli olduğu, aynı zamanda this question bakınız.

+0

Bu çözümü seviyorum! Ve vay, bu gerçekten düşmanca bir soruydu. – fozziethebeat

+6

Güzel bir yaklaşım, bu benim için işe yaramadı, bir DTD bulduğunda başarısız olduğu için, sadece göz ardı etmek yerine (not olarak, uygulamaya bağlı olabilir). Bunun hile yaptığını buldum: 'f.setValidating (false); f.setFeature ("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); –

+0

@ strangefeatures Teşekkürler. Bu yardımcı oldu. – Jus12

1

İlk olarak, bir XML uzmanı değilim. Öyleyse bu sadece bir tahmin ...

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

İlk yanıt, xml dosyasında yanlış DOCTYPE bulunduğumuzda çalışmaz. Benim çözümüm:

+0

Teşekkürler. Bu sorunun belirli bir sürümünü düzelten cevap budur. Kabul edildiğinde, "http://apache.org/xml/features/disallow-doctype-decl" öğesi true olarak ayarlandığında, DOCTYPE'ye izin verilmeyen "SAXParseExceptions" seçeneği verildi. Benim tahminim, posterin çalıştığı XML'in DOCTYPE bildirimlerine sahip olmamasıydı. Mayın onları vardı, ama DTD sağlanmadı/doğru yerde değildi/gerekli değildi. – AndrewO

İlgili konular