मैं एक जावा प्रोजेक्ट पर काम कर रहा हूं जहां मुझे किसी XML फ़ाइल से कुछ ऑब्जेक्ट्स पढ़ने की ज़रूरत है, कुछ प्रोसेसिंग करें जो ऑब्जेक्ट के एट्रिब्यूट्स को बदल दें और फिर ऑब्जेक्ट को किसी अन्य XML फ़ाइल में लिखें। उस उद्देश्य के लिए, मैं अपने मार्शलिंग और unmarshalling क्षमताओं, उनमें से प्रत्येक के लिए एक विधि के साथ JAXB का उपयोग कर रहा हूँ, इस तरह:नामस्थान उपसर्ग के बिना जेएक्सबी एक्सएमएल ऑब्जेक्ट मार्शलिंग
private MyObject unmarshallXMLFile(String file) {
MyObject t=null;
try {
jc = JAXBContext.newInstance("foo.bar");
Unmarshaller unmarshaller = jc.createUnmarshaller();
SchemaFactory sf = SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
unmarshaller.setSchema(sf.newSchema(new File("MySchema.xsd")));
t = (Task) unmarshaller.unmarshal(new File(file));
} catch (JAXBException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
return t;
}
private void marshallXMLFile(String file) {
task.setReplay(Boolean.TRUE);
Marshaller marshaller;
try {
marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, new Boolean(true));
marshaller.marshal(task, new FileOutputStream(file));
} catch (JAXBException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
समस्या यह है कि इस तरह के ns2 या NS3 के रूप में स्वचालित रूप से बना नामस्थान उपसर्ग में प्रदर्शित होने रखना है आउटपुट फ़ाइल, और फिर जब मैं unmarshallXMLFile विधि के साथ इन फ़ाइलों का पुन: उपयोग करना चाहता हूं (मैं आउटपुट फ़ाइलों को बाद में इनपुट के रूप में उपयोग करूँगा) यह स्कीमा के खिलाफ मान्य नहीं होगा, और एक org.xml.sax.SAXParseException फेंकता है।
XML स्कीमा: यहां फ़ाइलें मैं लिखा हैं जो भी
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<task xmlns="http://www.example.org/MySchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/MySchema MySchema.xsd ">
<replay>true</replay>
<threads>
<SPThreadID>0</SPThreadID>
<durtime>10</durtime>
<minexecutions>2</minexecutions>
<numThreads>3</numThreads>
<procedures>
<id>1</id>
<name>run</name>
<weight>15</weight>
<parameterPool>
<name>energy</name>
<dataType>integer</dataType>
<parmType>in</parmType>
<minValue>10</minValue>
<maxValue>50</maxValue>
<value>11</value>
</parameterPool>
<parameterPool>
<name>speed</name>
<dataType>integer</dataType>
<parmType>in</parmType>
<minValue>12</minValue>
<maxValue>80</maxValue>
<value>13</value>
</parameterPool>
</procedures>
</threads>
</task>
आउटपुट फ़ाइल (किसी भी प्रसंस्करण के बिना:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/MySchema"
xmlns:spm="http://www.example.org/MySchema"
elementFormDefault="qualified"
attributeFormDefault="qualified">
<element name="task" >
<complexType>
<sequence>
<element name="replay" type="boolean" default="false"/>
<element name="threads" type="spm:spThread" maxOccurs="unbounded" minOccurs="1" />
</sequence>
</complexType>
</element>
<complexType name="spThread">
<sequence>
<element name="SPThreadID" type="int" />
<element name="durtime" minOccurs="0" default="0">
<simpleType>
<restriction base="int">
<minInclusive value="0" />
</restriction>
</simpleType>
</element>
<element name="minexecutions" minOccurs="0" default="0">
<simpleType>
<restriction base="int">
<minInclusive value="0" />
</restriction>
</simpleType>
</element>
<element name="numThreads" type="int" />
<element name="procedures" type="spm:procedure" minOccurs="1"
maxOccurs="unbounded" />
</sequence>
</complexType>
<complexType name="procedure">
<sequence>
<element name="id" type="int" minOccurs="1" />
<element name="name" type="string" minOccurs="1" />
<element name="weight" minOccurs="1">
<simpleType>
<restriction base="int">
<minInclusive value="0" />
<maxInclusive value="100" />
</restriction>
</simpleType>
</element>
<element name="parameterPool" type="spm:parameter" nillable="true"
minOccurs="0" maxOccurs="unbounded" />
</sequence>
</complexType>
<complexType name="parameter">
<sequence>
<element name="name" type="string" minOccurs="1" />
<element name="dataType" type="spm:parameterDataType" default="integer"/>
<element name="parmType" type="spm:parameterType" default="in"
minOccurs="0" />
<element name="minValue" type="string"/>
<element name="maxValue" type="string"/>
<element name="value" type="string"/>
</sequence>
</complexType>
<simpleType name="parameterDataType">
<restriction base="string">
<enumeration value="integer" />
<enumeration value="varchar" />
<enumeration value="char" />
</restriction>
</simpleType>
<simpleType name="parameterType">
<restriction base="string">
<enumeration value="in" />
<enumeration value="out" />
<enumeration value="in_out" />
</restriction>
</simpleType>
</schema>
इनपुट फ़ाइल MySchema.xsd सिर्फ unmarshalling और तरीकों के साथ वापस वास्ते पहले उल्लेख किया गया है)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:task xmlns="http://www.example.org/MySchema" xmlns:ns2="http://www.example.org/MySchema.xsd">
<replay>true</replay>
<threads>
<SPThreadID>0</SPThreadID>
<durtime>10</durtime>
<minexecutions>2</minexecutions>
<numThreads>3</numThreads>
<procedures>
<id>1</id>
<name>run</name>
<weight>15</weight>
<parameterPool>
<name>energy</name>
<dataType>integer</dataType>
<parmType>in</parmType>
<minValue>10</minValue>
<maxValue>50</maxValue>
<value>11</value>
</parameterPool>
<parameterPool>
<name>speed</name>
<dataType>integer</dataType>
<parmType>in</parmType>
<minValue>12</minValue>
<maxValue>80</maxValue>
<value>13</value>
</parameterPool>
</procedures>
</threads>
</ns2:task>
अपवाद (आउटपुट फ़ाइल का उपयोग करते समय फिर से एक इनपुट ओं):
javax.xml.bind.UnmarshalException
- with linked exception:
[org.xml.sax.SAXParseException: cvc-elt.1: The declaration of the element'ns3:task' could not be found.]
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:326)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:500)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:206)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:175)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:148)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:153)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:162)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:180)
at Test.main(Test.java:48)
Caused by: org.xml.sax.SAXParseException: cvc-elt.1: The declaration of the element'ns3:task' could not be found.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
at org.apache.xerces.jaxp.validation.XMLSchemaValidatorHandler.startElement(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.ValidatingUnmarshaller.startElement(ValidatingUnmarshaller.java:85)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:113)
at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:202)
... 6 more
मैं विषय के बारे में पढ़ रहा है और संबंधित जवाब का भार की कोशिश की, लेकिन उनमें से कोई उपसर्ग दूर करने के लिए लगता है। मैं इस guide गड़बड़ गया लेकिन मैं उपयोग कर रहा जा रहा जैक्सबी का संस्करण नामस्थान PrefixMapper का समर्थन नहीं करता है। मैंने उपसर्गों को कॉन्फ़िगर करने के लिए here वर्णित एनोटेशन का उपयोग करने का प्रयास किया लेकिन यह काम नहीं करेगा।
शायद इस नामस्थान उपसर्ग से छुटकारा पाने का एक तरीका है: सभी फ़ोरम, उत्तर और चर्चाओं को मैंने इस उपसर्ग को अनुकूलित करने के बारे में बात की है, मैं बस उनसे छुटकारा पाना चाहता हूं। लेकिन किसी भी तरह से मुझे लगता है कि मैं अपनी इनपुट फ़ाइल और स्कीमा दोनों में कुछ खो रहा हूं। क्या वे अच्छी तरह से लिखे गए हैं? मैं कहूंगा कि समस्या ठीक है, क्योंकि यह पहली बार है कि मैं इस गहराई पर एक्सएमएल और एक्सएसडी के साथ काम करता हूं, और जो मैंने किया है वह केवल ऑनलाइन जो मैंने पाया है उसके आधार पर है। Xml और xsd डिज़ाइन को बेहतर बनाने के लिए कोई सुझाव अत्यधिक सराहना की जाएगी
क्या मुझे इनपुट फ़ाइल में या स्कीमा में किसी प्रकार के उपसर्ग का उपयोग करना चाहिए ताकि JAXB फ्रेमवर्क marshalling के समय यादृच्छिक उपसर्ग उत्पन्न नहीं करेगा?
अग्रिम धन्यवाद, मुझे आशा है कि आप लोग मेरी मदद कर सकते हैं।
-
उत्तर के लिए बहुत बहुत धन्यवाद। इस तरह से मैं नेमस्पेसफ्रिक्समैपर का उपयोग कर सकता हूं। हालांकि, जब मैं इसका इस्तेमाल, मेरे कोड अपवाद फेंक जब मैं इसे चलाने रखता है:
Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name javax.xml.bind.Messages, locale de_DE
at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:863)
at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:832)
at java.util.ResourceBundle.getBundle(ResourceBundle.java:576)
at javax.xml.bind.Messages.format(Messages.java:47)
at javax.xml.bind.Messages.format(Messages.java:36)
at javax.xml.bind.PropertyException.<init>(PropertyException.java:99)
at javax.xml.bind.helpers.AbstractMarshallerImpl.setProperty(AbstractMarshallerImpl.java:349)
at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.setProperty(MarshallerImpl.java:527)
at Test.main(Test.java:95)
मैंने पाया है कि यह एक .properties फ़ाइल के साथ कुछ करने के लिए है कि: मैं इसे ऐसा कुछ उपयोग नहीं कर रहा, मैं कुछ भी बदल नहीं किया ।
समान विषय/संभावित डुप्लिकेट: http://stackoverflow.com/questions/1982977/is-it-possible-to-custo मज़े-द-नेमस्पेस-उपसर्ग-वह-जैक्सब-उपयोग-कब-मार्शलिंग –