2013-12-09 3 views
6

मैं दो एक्सएमएल दस्तावेजों को पार्स करने का प्रयास करता हूं: <root/> और <root xmlns="hallo"/>। पहला मामला ठीक काम करता है, लेकिन बाद का मामला अपवाद फेंकता है (एक्सलान/एक्सरिस का उपयोग ओपनजेडीके 1.6/1.7 के साथ किया जाता है)। आसपास के कुछ googling से पता चलता है कि यह एक उपसर्ग के बिना एक एक्सएमएल नेमस्पेस के उपयोग के कारण होता है। इस तरह के दस्तावेज को पार्स करना मेरे लिए विदेशी से सामान्य लगता है, इसलिए मुझे आश्चर्य है कि समस्या के आसपास कैसे काम करना है।उपसर्ग के बिना नेमस्पेस के साथ पार्स एक्सएमएल: NAMESPACE_ERR

समस्या की रिपोर्ट करने वाले अन्य सभी लोगों को एसओएपी आवेदन के संदर्भ में समस्या थी और कुछ परिष्कृत सामान करने की कोशिश की, लेकिन मुझे कोई आसान सेटअप के साथ कोई भी नहीं मिला।

कुछ लोगों ने सुझाव दिया कि xalan को v2.7 में अपग्रेड करने से समस्या हल हो जाती है। मुझे नहीं पता कि ओपनजेडीके के साथ कौन सा संस्करण भेज दिया गया है, लेकिन मैंने क्लासपाथ पर स्पष्ट रूप से v2.7.1 डालने की कोशिश की और कुछ भी नहीं बदला। (मैं कैसे सत्यापित कर सकता हूं कि यह वास्तव में उपयोग किया गया संस्करण है?)।

कोई कामकाज?

ERROR: 'NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces.' 
javax.xml.transform.TransformerException: org.w3c.dom.DOMException: NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces. 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:720) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:317) 
    at de.smotive.server.resource.ResourceManagerTest.testName(ResourceManagerTest.java:36) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:616) 
    at org.testng.internal.MethodHelper.invokeMethod(MethodHelper.java:641) 
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:677) 
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:850) 
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1154) 
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:137) 
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:121) 
    at org.testng.TestRunner.runWorkers(TestRunner.java:1108) 
    at org.testng.TestRunner.privateRun(TestRunner.java:737) 
    at org.testng.TestRunner.run(TestRunner.java:596) 
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:315) 
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:310) 
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:272) 
    at org.testng.SuiteRunner.run(SuiteRunner.java:221) 
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1027) 
    at org.testng.TestNG.runSuitesLocally(TestNG.java:964) 
    at org.testng.TestNG.run(TestNG.java:896) 
    at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:89) 
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:144) 
    at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:111) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:616) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
Caused by: org.w3c.dom.DOMException: NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces. 
    at com.sun.org.apache.xerces.internal.dom.AttrNSImpl.setName(AttrNSImpl.java:108) 
    at com.sun.org.apache.xerces.internal.dom.AttrNSImpl.<init>(AttrNSImpl.java:77) 
    at com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl.createAttributeNS(CoreDocumentImpl.java:2142) 
    at com.sun.org.apache.xerces.internal.dom.ElementImpl.setAttributeNS(ElementImpl.java:659) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.SAX2DOM.startElement(SAX2DOM.java:213) 
    at com.sun.org.apache.xml.internal.serializer.ToXMLSAXHandler.closeStartTag(ToXMLSAXHandler.java:208) 
    at com.sun.org.apache.xml.internal.serializer.ToSAXHandler.flushPending(ToSAXHandler.java:281) 
    at com.sun.org.apache.xml.internal.serializer.ToXMLSAXHandler.endElement(ToXMLSAXHandler.java:247) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:604) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:183) 
    at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.emptyElement(XMLDTDValidator.java:814) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1320) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$ContentDriver.scanRootElementHook(XMLDocumentScannerImpl.java:1293) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3080) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:899) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:625) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:819) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:748) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123) 
    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 com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:640) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:711) 
    ... 32 more 
--------- 
org.w3c.dom.DOMException: NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces. 
    at com.sun.org.apache.xerces.internal.dom.AttrNSImpl.setName(AttrNSImpl.java:108) 
    at com.sun.org.apache.xerces.internal.dom.AttrNSImpl.<init>(AttrNSImpl.java:77) 
    at com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl.createAttributeNS(CoreDocumentImpl.java:2142) 
    at com.sun.org.apache.xerces.internal.dom.ElementImpl.setAttributeNS(ElementImpl.java:659) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.SAX2DOM.startElement(SAX2DOM.java:213) 
    at com.sun.org.apache.xml.internal.serializer.ToXMLSAXHandler.closeStartTag(ToXMLSAXHandler.java:208) 
    at com.sun.org.apache.xml.internal.serializer.ToSAXHandler.flushPending(ToSAXHandler.java:281) 
    at com.sun.org.apache.xml.internal.serializer.ToXMLSAXHandler.endElement(ToXMLSAXHandler.java:247) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:604) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:183) 
    at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.emptyElement(XMLDTDValidator.java:814) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1320) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$ContentDriver.scanRootElementHook(XMLDocumentScannerImpl.java:1293) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3080) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:899) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:625) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:819) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:748) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123) 
    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 com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:640) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:711) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:317) 
    at de.smotive.server.resource.ResourceManagerTest.testName(ResourceManagerTest.java:36) 

उत्तर

5

आप एक गैर नाम स्थान-अवगत पार्सर के साथ एक namespaced दस्तावेज़ को पार्स करने का प्रयास कर रहे: यहाँ अपवाद है

public class DemoTest { 

    @Test(dataProvider = "provide_xml") 
    public void transform_doesNotThrowException(final String xml) throws Exception { 
    final SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser(); 
    final SAXSource saxSource = new SAXSource(saxParser.getXMLReader(), new InputSource(new StringReader(xml))); 

    final Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
    final Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); 
    final DOMResult result = new DOMResult(document); 
    transformer.transform(saxSource, result); 
    } 

    @DataProvider 
    public Object[][] provide_xml() { 
    return new Object[][]{ 
     {"<root/>"}, // works 
     {"<root xmlns=\"hello\"/>"} // broken 
    }; 
    } 
} 

:

यहाँ मेरी समस्या के साथ एक परीक्षण है।

डिफ़ॉल्ट रूप से, एसएएक्स और डोम पार्सर्स नाम-अवगत नहीं हैं, आपको कारखाने पर setNamespace() स्पष्ट रूप से कॉल करने की आवश्यकता है। निम्नलिखित कोड को देखने के लिए अपना कोड बदलें और आपको जाने के लिए अच्छा होना चाहिए:

SAXParserFactory spf = SAXParserFactory.newInstance(); 
spf.setNamespaceAware(true); 
final SAXParser saxParser = spf.newSAXParser(); 
+0

वाह, यह था। त्रुटि संदेश में निश्चित रूप से सुधार के लिए कुछ जगह है। कभी-कभी यह इतना आसान हो सकता है। – yankee

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

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