2010-10-07 5 views
9

मैं अपनी XML फ़ाइल को सहेजने के लिए Transform ऑब्जेक्ट का उपयोग कर रहा हूं लेकिन यह खाली टेक्स्ट नोड्स को छोड़ने लगता है। क्या एक खाली स्ट्रिंग i.e. "" के साथ एक पाठ नोड बनाने (और रखने) का कोई तरीका है।खाली स्ट्रिंग मान (जावा में) के साथ एक XML टेक्स्ट नोड कैसे बनाएं

Element type = doc.createElement("TYPE"); 

type.appendChild(doc.createTextNode(value)); 

यह है सिर्फ इतना है कि कभी कभी value एक खाली स्ट्रिंग "" है:

यहाँ कैसे मैं नोड पैदा करते हैं। जब मैं एक पाठ संपादक के साथ एक्सएमएल देखो मैं

<TYPE /> 
बजाय

<TYPE></TYPE> 

देखने के बाद मैं इस एक्सएमएल फ़ाइल में वापस पढ़ सकते हैं और नोड्स < प्रकार > तत्व पार बस नहीं है किसी भी बच्चे ने हालांकि स्पष्ट रूप से इसके लिए एक #text नोड बनाया है!

संपादित करें - हैप्पी धन्यवाद (मेरे साथी कनाडाई के लिए)

महत्वपूर्ण नोट, मैं टैग का एक ज्ञात सेट से काम नहीं कर रहा हूँ, इस कार्यक्रम मैं पर काम कर रहा हूँ बल्कि एक पाठ नोड की उपस्थिति एक JTextField आवंटित करने के लिए उपयोग करता है जीयूआई के लिए। यह सिर्फ इतना है कि कभी-कभी क्षेत्र खाली छोड़ दिया जाता है (शून्य नहीं बल्कि "")। जब मैं उस फ़ील्ड को स्टोर करता हूं और फिर इसे वापस पढ़ता हूं तो GUI अब JTextField प्रस्तुत नहीं करता है क्योंकि कोई टेक्स्ट नोड नहीं है। इसलिए मैं एक XML दस्तावेज़ बनाने के तरीकों को देख रहा हूं जो टेक्स्ट नोड बनाता है भले ही इसमें कुछ भी न हो। अगर यह एक्सएमएल के साथ नहीं किया जा सकता है तो मुझे संपादन योग्य टैग को चिह्नित करने के लिए एक विशेषता का उपयोग करना होगा (कुछ हद तक एंड्री ब्रेस्लाव सुझाव दिया गया है) और इसलिए JTextField असाइन किया जाना चाहिए।

मैं मैड्स हैंनसेन को एक गैर-ब्रेकिंग स्पेस के सुझाव का प्रयास करूंगा।

+1

बराबर है करने के लिए

उत्तर

14

एक पाठ नोड पाठबिना एक पाठ नोड नहीं है।

यदि आप यह नियंत्रित करने की कोशिश कर रहे हैं कि XML तत्व को क्रमबद्ध किया गया है, <TYPE/> और <TYPE></TYPE> समकक्ष हैं, और यदि इसका उपयोग किया गया तो यह किसी XML प्रोसेसर से कोई फर्क नहीं पड़ता। दोनों text() के बिना एक TYPE तत्व घोषित कर रहे हैं। अधिकांश प्रोसेसर एक स्व-समापन तत्व के रूप में खाली तत्व को क्रमबद्ध करेंगे।

तुम सच में स्वयं बंद होने के रूप में धारावाहिक रूप से किया जा रहा तत्व को रोकने के लिए चाहते हैं, आप प्यारा हो और पाठ नोड मूल्य के रूप में एक शून्य चौड़ाई अंतरिक्ष जोड़ सकते हैं:<TYPE>&#x200B;</TYPE> जो तरह दिखेगा: <TYPE></TYPE>

यह तकनीकी रूप से एक "खाली" स्ट्रिंग नहीं है, लेकिन जो भी आप चाहते हैं उसे हासिल कर सकते हैं, और पाठ नोड का चयन और उपयोग होने पर अंतरिक्ष के साथ पैड नहीं होगा। तक यह उत्पन्न

try{ 
    DocumentBuilderFactory docFactory=DocumentBuilderFactory.newInstance(); 
    DocumentBuilder docBuilder=docFactory.newDocumentBuilder(); 

    //root Elements -- Response 
    Document doc=docBuilder.newDocument(); 
    doc.setXmlStandalone(true); 
    Element response=doc.createElement("Data"); 
    doc.appendChild(response); 

    // Child Element -- Play 
    Element hangup=doc.createElement("Type"); 
    response.appendChild(hangup); 

    //Writer the content into xml file 
    TransformerFactory transformerFactory=TransformerFactory.newInstance(); 
    Transformer transformer=transformerFactory.newTransformer(); 
    transformer.setOutputProperty(OutputKeys.INDENT,"yes"); 

    DOMSource source=new DOMSource(doc); 
    StreamResult result=new StreamResult(sayOut); 
    //StreamResult result=new StreamResult(System.out); 

    transformer.transform(source,result); 
    logger.info("===========XML GENERATION DON FOR HANGUP============"); 

}catch(ParserConfigurationException pce){ 
    logger.error(" ==============2======== ERROR IN PRASERCONFIGURATION ==================================="); 
    pce.printStackTrace(); 
} 

आउटपुट::

+0

यह वही करता है जो मैं चाहता हूं। मुझे खाली फिंगिंग को # x200B के साथ बदलने के लिए अपना फोकस श्रोता बदलना पड़ा; लेकिन वह कुछ हद तक मामूली था। एकमात्र बड़ी कमी यह है कि अगर कोई मैन्युअल रूप से एक्सएमएल फाइल को संपादित कर रहा था और एक खाली क्षेत्र में एक गैर-ब्रेकिंग स्पेस डालना भूल गया तो यह मेरे जीयूआई को गड़बड़ कर देता है - लेकिन मैं इसके साथ रह सकता हूं :) – BigMac66

1

मैं टैग सामग्री के बजाय एक स्ट्रिंग विशेषता के लिए जाऊंगा। एक और विकल्प सामग्री का उपयोग करना है, लेकिन सामग्री खाली स्ट्रिंग के मामले में एक विशेषता डालें।

+0

मैं इस कोशिश की और यह काम करता है लेकिन एक्सएमएल फ़ाइल के बारे में 20% बड़ा बना दिया है और सिर्फ सही IMO मुड़कर नहीं देखा। – BigMac66

0

यदि आप XML specs पर विचार करते हैं, तो एक खाली स्ट्रिंग 'मान्य वर्णों के सेट में वास्तव में परिभाषित नहीं है। इसलिए यह संभव है कि दस्तावेज़ निर्माता बस वर्णों की किसी भी घटना को अनदेखा करता है जो मान्य नहीं है।

4

किसी XML बिंदु दृश्य से, <TYPE/> और <TYPE></TYPE> के बीच कोई अंतर नहीं है। दोनों समकक्ष हैं और एक दूसरे के लिए इस्तेमाल किया जा सकता है। एक एक्सएमएल पार्सर के लिए इसका मतलब है कि कोई टेक्स्ट नहीं है। पार्सर "नो टेक्स्ट" और "शून्य लंबाई टेक्स्ट" के बीच अंतर नहीं करता है।

इसके विपरीत जावा के null और "" पूरी तरह से अलग अवधारणाएं हैं।

तो यदि आप जावा मानों से एक्सएमएल में मैप करना चाहते हैं और इसके विपरीत आपको उस मेल को पकड़ना है। और कई संभावित विकल्प हैं। उदाहरण के लिए आप अपने स्ट्रिंग चर के लिए null मानों को छोड़ सकते हैं। फिर आपको यह सुनिश्चित करना होगा कि आपके सभी स्ट्रिंग चर रिक्त तारों के साथ आरंभ किए गए हैं। या आप एक टेक्स्ट बच्चे के बिना एक प्रकार का तत्व कह सकते हैं (<TYPE/> या <TYPE></TYPE> के रूप में क्रमबद्ध) का मतलब है जावा में खाली स्ट्रिंग और अनुपलब्ध TYPE तत्व null के लिए है। यह तुम्हारी पसंद है।

2

यहाँ तुम क्या देख रहे के लिए कोड है

<?xml version="1.0" encoding="UTF-8"?> 
<Data> 
<Type/> 
</Data> 

आशा मैं सही काम दे दिया है ... हालांकि मुझे लगता है कि <Type/> या के साथ सहमत <Type></Type> एक्सएमएल पार्सर के संबंध में कोई फर्क नहीं पड़ता।

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