2008-11-20 10 views
8

भाव मैं जानता हूँ कि यह वास्तव में क्या XPath के लिए है नहीं है, लेकिन मैं मान कैसे मैं एक XML दस्तावेज निर्माण के बारे में जाना होगा के लिए xPath अभिव्यक्ति की एक HashMap है। मुझे dom-4j का DocumentHelper.makeElement (शाखा, xpath) मिला है, सिवाय इसके कि यह विशेषताएँ या अनुक्रमण बनाने में असमर्थ है। निश्चित रूप से एक पुस्तकालय मौजूद है जो यह कर सकता है?जावा: निर्माण एक्सएमएल XPath का उपयोग कर दस्तावेज़

Map xMap = new HashMap(); 

xMap.put("root/entity/@att", "fooattrib"); 
xMap.put("root/array[0]/ele/@att", "barattrib"); 
xMap.put("root/array[0]/ele", "barelement"); 
xMap.put("root/array[1]/ele", "zoobelement"); 

परिणाम में होगा:

<root> 
<entity att="fooattrib"/> 
<array><ele att="barattrib">barelement</ele></array> 
<array><ele>zoobelement</ele></array> 
</root> 
+0

कि देखें: [http://stackoverflow.com/questions/508390/create-xml-nodes-based-on-xpath](http: //स्टैक ओवरफ़्लो।कॉम/प्रश्न/5083 9 0/create-xml-nodes-based-on-xpath), सी # में बनाया गया है लेकिन समस्या का जवाब देता है। – Benj

+0

मैं वही चीज़ ढूंढ रहा हूं। मुझे विश्वास नहीं है कि इस पुस्तकालय की अनुमति नहीं है। दुर्भाग्यवश मेरे पास एक बनाने का समय नहीं है इसलिए मैं शायद एक त्वरित और गंदे समाधान के साथ जाऊंगा, शायद जावा में निम्नलिखित सी # कोड का अनुकूलन कर रहा है, ऐसा लगता है कि मूलभूत आवश्यकताओं को शामिल किया गया है: http://stackoverflow.com/questions/ 508,390/बनाने-एक्सएमएल-नोड्स आधारित-ऑन-xpath – Damien

उत्तर

2

मैं कुछ साल पहले कुछ इसी तरह के लिए देखा - लिखने योग्य XPath का एक तरह। अंत में, कुछ भी नहीं मिला है, मैं कुछ जो अनिवार्य रूप से XML दस्तावेज़ को बनाया भाव माता-पिता के लिए नए नोड्स जोड़कर काट दिया:

parent="/" element="root" 
parent="/root" element="entity" 
parent="/root/entity" attribute="att" value="fooattrib" 
parent="/root" element="array" 
parent="/root" element="ele" text="barelement" 

(यह अपने आप में एक XML विन्यास फाइल के द्वारा नियंत्रित किया जा रहा था, इसलिए उपरोक्त उपस्थिति।)

यह कुछ अंतिम स्वचालित तत्व लेने के लिए स्वचालित करने का प्रयास करने के लिए प्रेरित होगा, और इसमें से कुछ बनायेगा, लेकिन मुझे हमेशा लगा कि XPath अभिव्यक्तियां मैं लिख सकता था एक बेवकूफ दृष्टिकोण गलत हो जाएगा।

एक और दृष्टिकोण जिसे मैंने माना, हालांकि लागू नहीं किया गया था (उपर्युक्त "पर्याप्त" था), उत्कृष्ट जैक्सन का उपयोग उन तत्वों को उत्पन्न करने के लिए करना था जो मौजूद नहीं थे, अगर फ्लाई पर यह पहले से मौजूद नहीं था।

Jaxen FAQ से:

केवल एक चीज की आवश्यकता इंटरफेस org.jaxen.Navigator के एक कार्यान्वयन है। ऑर्गे.जेक्सन के रूप में सभी इंटरफ़ेस की आवश्यकता नहीं है, और डिफ़ॉल्ट कार्यान्वयन नहीं है। डिफॉल्ट नॅविगेटर भी प्रदान किया जाता है।

DOMWriterNavigator लपेटो जाएगा और मौजूदा DOMNavigator, और फिर makeElement विधि का उपयोग करता है, तो तत्व मौजूद नहीं था। हालांकि, यहां तक ​​इस दृष्टिकोण, आप शायद attributes और text() कार्यों जैसी चीजों के लिए XPath क्वेरी के कुछ पूर्व/पोस्ट प्रोसेसिंग कर दिया था साथ।

2

सबसे अच्छा मैं एक जेएक्सबी कार्यान्वयन का उपयोग करने में सक्षम था, जो xshall/unmarshal ऑब्जेक्ट्स xml पर होगा और फिर मैंने डोज़र (http://dozer.sourceforge.net/documentation/mapbackedproperty.html) का उपयोग किया था। xpaths को मैप करने के लिए जो मानचित्र में कुंजी JAXB ऑब्जेक्ट विधि सेटर्स पर थीं।

<mapping type="one-way" map-id="TC1"> 
<class-a>java.util.Map</class-a> 
<class-b>org.example.Foo</class-b> 
<field> 
    <a key="root/entity/@att">this</a> 
    <b>Foo.entity.att</b> 
    <a-hint>java.lang.String</a-hint> 
</field> 

यह एक दो चरणों समाधान के अधिक है, लेकिन वास्तव में मेरे लिए काम किया।

2

मैं भी आवश्यकता के एक ही तरह जहां स्वभाव इतना गतिशील है चाहता था और XSLT या किसी वस्तु मानचित्रण चौखटे का उपयोग करना चाहते नहीं है, तो मैं जावा में इस कोड और लिखित ब्लॉग उस पर कृपया देखें,

http://ganesh-kandisa.blogspot.com/2013/08/dynamic-xml-transformation-in-java.html को क्रियान्वित किया है

या Git भंडार में कांटा कोड,

https://github.com/TheGanesh/DynamicXMLTransformer

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