2011-10-28 8 views
6

मैं अपनी कक्षाओं और आउटपुट को जितना संभव कर सकता हूं उतना सरल बनाने जा रहा हूं, लेकिन मूल रूप से मैं जो कर रहा हूं वह है कि मैं org.w3c.dom.Element (इस मामले में एक परमाणु लिंक का प्रतिनिधित्व करना) को JAXB में जोड़ना चाहता हूं वस्तु मैं वापस आ रहा हूँ। JAXB क्लास लग रहा है कि:रीस्टेसी/जेएक्सबी; कैसे मैं एक नाम स्थान से बचने है एक <any> टैग में एक तत्व को जोड़ा जा रहा है? (JAXB में <Element>)

import javax.xml.bind.annotation.XmlAnyElement; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlType; 
import org.w3c.dom.Element; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "People", namespace = "main", propOrder = { 
    "any", 
    "persons" 
}) 
public class People { 
    @XmlAnyElement 
    protected List<Element> any; 
    @XmlElement(name = "person", namespace = "main") 
    protected List<Person> persons; 
    [...] 
} 

मैं मैं इस तरह बनाने के एक टेम्पलेट का उपयोग कर तत्व बना रहा हूं:

import javax.xml.XMLConstants; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.transform.stream.StreamSource; 
import javax.xml.validation.Schema; 
import javax.xml.validation.SchemaFactory; 
import org.w3c.dom.DOMException; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.xml.sax.SAXException; 

public class ElementGen { 
    public Element getTemplate() throws DOMException, SAXException, ParserConfigurationException { 
     final SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
     final Schema schema = sf.newSchema(new StreamSource(
       Thread.currentThread().getContextClassLoader().getResourceAsStream(ATOM_XSD))); 
     final DocumentBuilderFactory docBuilder = DocumentBuilderFactory.newInstance(); 
     docBuilder.setSchema(schema); 
     final Document doc = docBuilder.newDocumentBuilder().newDocument(); 
     linkTemplate = doc.createElementNS(ATOM_NAMESPACE, ATOM_LINK); 
     return linkTemplate; 
    } 
} 

(यही कारण है कि वास्तव में वर्ग कैसा दिखता है, मैं सिर्फ कोशिश कर रहा हूँ नहीं है इसे बाहरी बाहरी गड़बड़ के बिना परीक्षण करने के लिए कुछ संकलित करना जितना आसान हो सके)।

मैं तो का उपयोग कर उस टेम्पलेट क्लोन linkTemplate.cloneNode(false);

अब इस सब में काम करता है कि यह एक्सएमएल दिखाए, लेकिन अजीब बात यह है कि एक्सएमएल मैं वापस पाने के अतिरिक्त नामस्थान दी जाती है है:

<atom:link xmlns:ns3="main" xmlns="" href="href" rel="rel"/> 

मैं तो जोड़ने linkTemplate.setAttribute("xmlns", null); "xmlns: NS3" नाम स्थान गायब हो जाता है और मैं:

<atom:link xmlns="" href="href" rel="rel"/> 

लेकिन वहाँ दूर करने कि xmlns का कोई रास्ता नहीं हो रहा है = ""। क्या मैं गलत तरीके से तत्व बना रहा हूं? या शायद कुछ और गलत हो रहा है? मैं क्यों यह इन सब पर तो कोई मदद/स्पष्टीकरण की सराहना की जाएगी जोड़ने है के रूप में एक नुकसान में नहीं बल्कि कर रहा हूँ।

संपादित करें: मेरा मानना ​​है कि यह दस्तावेज मैं तत्व पैदा करने के लिए उपयोग किए जाने वाले नाम स्थान से संबंधित होना चाहिए, लेकिन मुझे यकीन है कि यह कैसे तय करने के लिए नहीं कर रहा हूँ। क्या दस्तावेज़ पर (एक्सएमएल) लक्ष्य नामस्थान स्थापित करने का कोई तरीका है?

संपादित करें 2: मुझे यकीन नहीं है कि यह किसी के लिए कुछ भी उपयोगी बनाता है, लेकिन अधिक प्रयोग के साथ मैंने पाया कि linkTemplate.setAttribute("xmlns:" + anything, null);xmlns:[anything]="" के साथ एक लिंक बनाने और अन्यथा उत्पन्न होने वाले अन्य लोगों को हटाने का प्रभाव है।

संपादित करें 3: XSD के प्रासंगिक बिट JAXB वस्तुओं उत्पन्न करने के लिए प्रयोग किया जाता है:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<xs:schema version="1.0" 
    xmlns="main" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:atom="http://www.w3.org/2005/Atom" 
    targetNamespace="main" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified"> 

<xs:complexType name="People"> 
    <xs:sequence> 
     <xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/> 
     <xs:element name="person" type="Person" minOccurs="0" maxOccurs="unbounded"/> 
    </xs:sequence> 
    [attributes] 
</xs:complexType> 
[other types etc.] 

उत्तर

0

चूंकि यहां दिए गए किसी भी सुझाव ने मेरे लिए काम नहीं किया है, मैंने एक अलग मार्ग जाने का फैसला किया है। अंत में मैं अधिलेखित श्रोता RESTEasy मेरी खुद की एक श्रोता के साथ Marshaller में जोड़ता है समाप्त हो गया। यह श्रोता तब RESTServiceDiscovery फ़ील्ड पर मैन्युअल रूप से लिंक जोड़ने से पहले रीस्टेसी श्रोता (यदि यह मौजूद था) को कॉल करता है (आपको प्रतिबिंब का उपयोग करके यह फ़ील्ड प्राप्त करना होगा, और ऑब्जेक्ट प्राप्त करने से पहले field.setAccessible (true) के साथ एक्सेस जांच को बंद करना होगा) ।

0

ATOM_LINK = "लिंक" का मूल्य है? यदि ऐसा है, तो यह "परमाणु: लिंक" होना चाहिए, और setPrefix() कॉल को हटा दें।

+0

हां, यह है। और मुझे एहसास हुआ कि सवाल लिखने के बाद, लेकिन परिणाम दुर्भाग्य से वही है। : \ – Thor84no

+0

क्या आप अपना अपडेट किया गया कोड पोस्ट कर सकते हैं? – jtahlborn

+0

एह। यह सचमुच है कि। ATOM_LINK अब "परमाणु: लिंक" है और सेटफ्रिक्स चला गया है। मैंने रूट तत्व बनाने और इस तत्व को उस बच्चे के रूप में बनाने का भी प्रयास किया, लेकिन यह कुछ भी नहीं किया, इसलिए मैंने इसे फिर से हटा दिया। – Thor84no

0

मेरा मानना ​​है कि समस्या यह है कि DocumentBuilderFactory आप नाम अंतरिक्ष पता होना चाहिए बनाने AERE है।

public class ElementGen { 
    public Element getTemplate() throws DOMException, SAXException, ParserConfigurationException { 
    final DocumentBuilderFactory docBuilder = DocumentBuilderFactory.newInstance(); 
    docBuilder.setNamespaceware(true); 
    final Document doc = docBuilder.newDocumentBuilder().newDocument(); 
    linkTemplate = doc.createElementNS(ATOM_NAMESPACE, ATOM_LINK); 
    return linkTemplate; 
    } 
} 

आप पाते हैं अपने आप को xmlns विशेषता सीधे जोड़ तोड़, तो somethibng गलत है।

+0

सुझाव के लिए धन्यवाद, लेकिन दुर्भाग्य से परिणाम बिल्कुल वही है। – Thor84no

+0

हम्म। नामस्थान घोषणा के लिए परमाणु उपसर्ग क्यों नहीं है? यह दस्तावेज़ कैसा दिखता है? –

+0

मुझे यकीन नहीं है कि मैं पूरी तरह से समझता हूं कि आप क्या पूछ रहे हैं। आप किस दस्तावेज़ को देखना चाहते हैं? – Thor84no

0

आप अपने elementFormDefault करने के लिए "अयोग्य" सेटिंग की कोशिश की है?

+0

सुझाव के लिए धन्यवाद, लेकिन दुर्भाग्य से यह काम नहीं किया है। – Thor84no

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