2010-10-13 7 views
12

शीर्षक सुंदर आत्म-व्याख्यात्मक है। मैं इसकी सुविधा का आनंद लेने के लिए, org.w3c.dom.Document के एक स्काला नोडसेक के दस्तावेज़ को कैसे परिवर्तित कर सकता हूं?स्कैला: org.w3c.dom कनवर्ट करें। Scala.xml को दस्तावेज़। नोडसेक

चीयर्स
परसा

उत्तर

12
def asXml(dom: org.w3c.dom.Node): Node = { 
    val dom2sax = new DOM2SAX(dom) 
    val adapter = new NoBindingFactoryAdapter 
    dom2sax.setContentHandler(adapter) 
    dom2sax.parse() 
    return adapter.rootElem 
    } 
+0

सवाल 'scala.xml.NodeSeq' लेकिन अपने कोड को' org.w3c.dom.Document' से एक कनवर्टर के लिए पूछना एक 'org.w3c.dom ले। पैरामीटर के रूप में नोड '। - और उपयुक्त 'आयात' होने से हमेशा यह थोड़ा आसान हो जाता है। – Martin

+1

मुझे 'scala.xml.parsing.N.NoBindingFactoryAdapter' मिला लेकिन मुझे कम पैसे के लिए' DOM2SAX' नहीं मिला। या बेहतर Google कई परिणामों पर लौटता है इसलिए मुझे नहीं पता कि कौन सा है। - कृपया: उदाहरण कोड पूरी तरह से योग्य वर्ग के नाम। धन्यवाद – Martin

+0

मुझे लगता है कि आप 'org.apache.xalan.xsltc.trax.DOM2SAX' का मतलब है जिसका न केवल मतलब है कि किसी को पैकेज नाम पता होना चाहिए। किसी को भी यह पता लगाना होगा कि यह कौन सी बाहरी लाइब्रेरी है। - तो एक बाएं: 'org.w3c.dom.Document' को' org.w3c.dom.Node' में कैसे परिवर्तित करें। – Martin

3

मैं दूसरी दिशा में जाने के लिए एक Dom4J नोड के लिए एक स्काला नोड से एक समय पहले इस कोड को लिखा था। यह एक पेड़ के ऊपर recursing के मूल विचार से पता चलता है और अनुकूल करने के लिए बहुत आसान होना चाहिए:

implicit def scalaToDom4j(n : Node) : DElem = { 

    def inner(n : Node) : Option[DNode] = { 
    n match { 
     case e : Elem => 
     val elem = DocumentHelper.createElement(e.label) 
     for(c <- e.child) yield inner(c) collect { 
      case Some(child) => elem.add(child) 
     } 
     Some(elem) 
     //as Scala's xml is type-aware, text might not actually be a Text node, 
     //but an Atom of some other type 
     case t : Atom[_] => 
     Some(DocumentHelper.createText(t.data.toString)) 
     case x => None 
    } 
    } 

    //Attempt the conversion. Throw an exception if something has gone badly wrong 
    //inner returns an Option[DNode], but the expected top-level type is a DElem 
    // (which is a subclass of DNode) 
    //so we also validate this. 
    inner(trim(n)) map (_.asInstanceOf[DElem]) getOrElse (error("xml failed")) 
} 
0

मैं (एन) समारोह से ऊपर, केवल सैक्सन XdmNode में scalaToDom4j को पुनरावर्ती पैटर्न मिलान कोड समान है स्कैला नोड दिशा में: https://github.com/LeifW/MusicPath/blob/master/src/main/scala/org/musicpath/saxon2scala/Saxon2Scala.scala

वर्तमान में यह केवल पाठ, तत्व, और गैर-नामांकित विशेषता नोड्स बनाता है, लेकिन इसे सामान्यीकृत/समाप्त करना आसान होना चाहिए।

5

IttayD का उत्तर सभी w3c एक्सएमएल के लिए अच्छा है - dom4j w3c संगत xmls को छोड़कर। सभी W3C प्रकार के लिए निम्नलिखित काम करता है:

def asXml(dom: _root_.org.w3c.dom.Node): Node = { 
    val source = new DOMSource(dom) 
    val adapter = new NoBindingFactoryAdapter 
    val saxResult = new SAXResult(adapter) 
    val transformerFactory = javax.xml.transform.TransformerFactory.newInstance() 
    val transformer = transformerFactory.newTransformer() 
    transformer.transform(source, saxResult) 
    adapter.rootElem 
    } 
+0

मैं इसे इटैड के समान कहता हूं: कृपया: उदाहरण कोड पूरी तरह से योग्य वर्ग के नाम। धन्यवाद। और खराब है कि 'javax.xml.transform.dom.DOMSource' एंड्रॉइड एपीआई <8 पर उपलब्ध नहीं है। लेकिन मुझे लगता है कि आपकी समस्या नहीं है। – Martin

+0

आपका 'ट्रांसफॉर्मर फैक्टरी' कहां से आता है? –

+1

@ जीन-फिलिप गोली एक वैल ट्रांसफॉर्मर है फैक्टरी = javax.xml.transform.TransformerFactory.newInstance() युक्त ऑब्जेक्ट में परिभाषित किया गया है। –

संबंधित मुद्दे