2011-07-05 16 views
9

मैं एक जावा प्रोजेक्ट पर काम कर रहा हूं जहां मुझे किसी 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 फ़ाइल के साथ कुछ करने के लिए है कि: मैं इसे ऐसा कुछ उपयोग नहीं कर रहा, मैं कुछ भी बदल नहीं किया ।

+0

समान विषय/संभावित डुप्लिकेट: http://stackoverflow.com/questions/1982977/is-it-possible-to-custo मज़े-द-नेमस्पेस-उपसर्ग-वह-जैक्सब-उपयोग-कब-मार्शलिंग –

उत्तर

3

ठीक है, कुछ शोध के बाद, मैं वर्गों मैं क्रमानुसार करने कोशिश कर रहा हूँ की प्रत्येक विशेषता पर @XMLElement टैग का उपयोग कर, स्पष्ट रूप से निर्दिष्ट करने क्या मेरी नाम स्थान था, और उपयोग करने की कोशिश हर विशेषता पर एक ही एक:

@XmlElement(required = true, name="myObjectPool", namespace="http://www.example.org/StoredProceduresSchema") 
    protected List<MyObject> myObjectPool; 

यह दोषरहित काम किया: मार्शल फ़ाइल में कोई अधिक अजीब नामस्थान।

मैं उनके उत्तर के लिए धन्यवाद देना चाहता हूं: मैंने भी कोशिश की, लेकिन मुझे एक अजीब भाषा बंडल संबंधित अपवाद मिला। मुझे खुशी है कि इस सरल दृष्टिकोण ने इस मुद्दे को हल किया।

+0

क्या हम उस @XmlElement में उपसर्ग का उपयोग कर सकते हैं –

3

उपयोग करने का प्रयास एक NamespacePrefixMapper:

NamespacePrefixMapper mapper = new NamespacePrefixMapper() { 
    public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) { 
     return ""; 
    } 
}; 
marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", mapper); 
+0

उत्तर के लिए बहुत बहुत धन्यवाद। इस तरह से मैं नेमस्पेसफ्रिक्समैपर का उपयोग कर सकता हूं। हालांकि, जब मैं इसका उपयोग करता हूं, तो मेरा कोड इसे चलाने पर अपवाद फेंकता रहता है: – Lak

11

प्रत्येक तत्व में @XmlElement के नेमस्पेस विशेषता को निर्दिष्ट करने के बजाय, पैकेज स्तर पर एनोटेट करना आसान है। आप उस पैकेज के नीचे फ़ाइल package-info.java बनाकर ऐसा करते हैं, जिसे आप एनोटेट करना चाहते हैं।

उदाहरण के लिए, यदि आप पैकेज org.example टिप्पणी करने के लिए चाहते हैं, तो package-info.java नाम की एक फ़ाइल निर्देशिका org/उदाहरण के भीतर निम्नलिखित सामग्री के साथ रखा जाना चाहिए:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.org/StoredProceduresSchema", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
package org.example; 

यह ध्यान रखें कि आप व्याख्या करना चाहिए महत्वपूर्ण है प्रत्येक पैकेज जिसमें कक्षाएं होती हैं जो आपकी योजना को मार्शल या उनसे संदर्भित करती हैं।

आशा इस मदद करता है :)

1

तो फिर तुम एक अलग JAXB कार्यान्वयन संदर्भ का उपयोग कर किया जा सकता है तो। यह लेख पढ़ें और फिर कोशिश करें: http://blog.bdoughan.com/2011/11/jaxb-and-namespace-prefixes.html (या यदि आप आलसी हैं: com.sun.xml.internal.bind.namespacePrefixMapper साथ com.sun.xml.bind.namespacePrefixMapper की जगह)

1

जावा 7/8 समाधान

यह समस्या डिफ़ॉल्ट कार्यान्वयन JAXB प्रदाता से संबंधित है। मुझे एक अलग कार्यान्वयन का उपयोग करके समाधान मिला है: EclipseLink MOXy

1. निम्न पंक्ति
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

कदम पैकेज मॉडल

3. पैकेज-फ़ाइल बनाने में फ़ाइल युक्त एक फ़ाइल jaxb.properties बनाने pom.xml
<dependency> 
    <groupId>org.eclipse.persistence</groupId> 
    <artifactId>org.eclipse.persistence.moxy</artifactId> 
    <version>2.5.0</version> 
</dependency>` 
2. में निर्भरता जोड़ें। मॉडल पैकेज में जावा
@XmlSchema(xmlns = { @XmlNs(prefix = "video", namespaceURI = "http://www.google.com/schemas/sitemap-video/1.1"), 
     @XmlNs(prefix = "", namespaceURI = "http://www.sitemaps.org/schemas/sitemap/0.9")}) 

package it.my.sitemap.model; 

import javax.xml.bind.annotation.XmlNs; 
import javax.xml.bind.annotation.XmlSchema; 
संबंधित मुद्दे