2009-05-15 3 views
7

मेरे आवेदन में, मैं एक्सएमएल फाइलों का कुछ हिस्सा बदलता हूं, जो इस तरह से शुरू होता है:जावा के साथ पार्स करते समय दस्तावेज़ तत्व से पहले व्हाइटस्पेस कैसे रखें?

<?xml version="1.0" encoding="UTF-8"?> 
<!-- $Id: version control yadda-yadda $ --> 

<myElement> 
... 

<myElement> से पहले रिक्त रेखा नोट करें। लोड करने, बदलने और सहेजने के बाद, परिणाम सुखदायक से बहुत दूर है:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- $Id: version control yadda-yadda $ --><myElement> 
... 

मुझे पता चला कि टिप्पणी और दस्तावेज़ नोड के बीच व्हाइटस्पेस (एक नई लाइन) DOM में बिल्कुल प्रदर्शित नहीं है। निम्नलिखित स्व-निहित कोड विश्वसनीय रूप से समस्या को पुन: उत्पन्न करता है:

String source = 
    "<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n<!-- foo -->\n<empty/>"; 
byte[] sourceBytes = source.getBytes("UTF-16"); 

DocumentBuilder builder = 
    DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
Document doc = 
    builder.parse(new ByteInputStream(sourceBytes, sourceBytes.length)); 

DOMImplementationLS domImplementation = 
    (DOMImplementationLS) doc.getImplementation(); 
LSSerializer lsSerializer = domImplementation.createLSSerializer(); 
System.out.println(lsSerializer.writeToString(doc)); 

// output: <?xml version="1.0" encoding="UTF-16"?>\n<!-- foo --><empty/> 

क्या किसी को यह पता है कि इससे कैसे बचें? अनिवार्य रूप से, मैं आउटपुट इनपुट के समान होना चाहता हूं। (मुझे पता है कि एक्सएमएल घोषणा पुन: उत्पन्न की जाएगी क्योंकि यह डीओएम का हिस्सा नहीं है, लेकिन यह कोई मुद्दा नहीं है।)

+1

मैंने कस्टम आउटपुटस्ट्रीम क्लास का उपयोग करके आउटपुट में हैकिंग समाप्त कर दी जो "-><" के पहले अवसर की तलाश में है और दो न्यूलाइन जोड़ता है; मैं केवल इस स्ट्रीम का उपयोग करता हूं यदि पहला दस्तावेज़ बाल नोड वास्तव में एक टिप्पणी है। अभी भी एक हैक, लेकिन कम से कम अच्छी तरह से encapsulated :-) –

+0

मेरे पास एक ही मुद्दा है। क्या आप कृपया मदद कर सकते हैं? http://stackoverflow.com/questions/30940162/dom-parser-wrong-childnodes-count – user3930361

उत्तर

2

मूल कारण है कि मानक DOM Level 3 कल्पना को तोड़ने के बिना एक दस्तावेज़ के बच्चों के रूप में पाठ नोड्स का प्रतिनिधित्व नहीं कर सकते हैं। Whitespace किसी भी अनुपालन पार्सर द्वारा गिरा दिया जाएगा।

Document -- 
    Element (maximum of one), 
    ProcessingInstruction, 
    Comment, 
    DocumentType (maximum of one) 

आप मानकों का अनुपालन करने समाधान की आवश्यकता है और उद्देश्य के लिए 100% प्रजनन पठनीयता के बजाय है, तो मैं अपने उत्पादन तंत्र में ढूंढते हैं।

+0

अच्छा जवाब, लेकिन यह मेरी राय में spec में एक बेवकूफ बग है। आप निश्चित रूप से दस्तावेज़ तत्व से पहले पाठ आउटपुट कर सकते हैं, लेकिन आप इसे इनपुट नहीं कर सकते? – Archie

+0

@McDowell हम इससे बचने के लिए कुछ भी कर सकते हैं, कृपया मेरे प्रश्न को देखें। http://stackoverflow.com/questions/30940162/dom-parser-wrong-childnodes-count – user3930361

1

सामान्य सफेद रिक्त स्थान को एक्सएमएल में अप्रासंगिक माना जाता है और इस प्रकार कोई XML फ़ाइल पार्स नहीं होने पर संरक्षित नहीं होती है । एक्सएमएल आउटपुट करने वाले अधिकांश पुस्तकालयों में इसे अच्छे स्वरूपण और सही इंडेंटेशन के साथ आउटपुट करने का विकल्प होता है लेकिन यह हमेशा काफी सामान्य होगा। नहीं "पर एक अतिरिक्त लाइन सही" है।

+1

बिंदु यह है कि मूल इनपुट में * एक पंक्ति थी, और इसे रखा जाना चाहिए - जैसा कि सभी सफेद जगहों के मामले में है दस्तावेज़ के शेष में! –

3

आप इससे क्यों बचना चाहते हैं?

टैग/तत्वों के बाहर सफेद-स्थान को spec द्वारा महत्वहीन के रूप में परिभाषित किया गया है। यह बस अस्तित्व में नहीं है, जहां तक ​​इन्फोसेट का संबंध है, जो आपके डोम द्वारा दर्शाया जाता है।

नतीजतन, डोम को फिर से क्रमबद्ध करने पर, यह वहां नहीं होगा।

यदि आप इस खाली रेखा पर निर्भर कुछ विकसित करने की प्रक्रिया में हैं ... नहीं।

+0

कोई प्रोग्राम निश्चित रूप से इस प्रारूप पर निर्भर नहीं है। हालांकि, फ़ाइलों में अनुवाद डेटा होता है; वे संस्करण नियंत्रण में चेक इन हैं और लगातार बनाए रखा है। इस प्रकार, यह अंतर देखने के लिए अच्छा होगा अगर मेरे ऐप में केवल बदलाव ही जानबूझकर होते हैं। –

+0

मैंने ऐसा सोचा था ... मुझे लगता है कि इससे निपटने का एकमात्र समझदार तरीका फाइलों में इस रिक्त रेखा को शुरू करने के लिए नहीं है। मुझे नहीं लगता कि इस लाइन को बनाए रखने की कोई सिफारिश योग्य विधि है। हो सकता है कि फ़ाइलों को इन विसंगतियों से बचने के लिए चेकइन से पहले एक टिडींग टूल के माध्यम से पारित नियम के रूप में होना चाहिए। – Tomalak

+0

@ टोमालक :: क्या आप मेरी मदद कर सकते हैं: http://stackoverflow.com/questions/30940162/dom-parser-wrong-childnodes-count – user3930361

6

मुझे एक ही समस्या थी। मेरा समाधान मेरा स्वयं का एक्सएमएल पार्सर लिखना था: DecentXML

मुख्य विशेषता: यह 100% मूल इनपुट, व्हाइटस्पेस, इकाइयों, सब कुछ को संरक्षित कर सकता है। यह आपको विवरण से परेशान नहीं करेगा, लेकिन यदि आपके कोड को इस तरह एक्सएमएल उत्पन्न करने की आवश्यकता है:

<element 
    attr="some complex value" 
    /> 

तो आप कर सकते हैं।

+0

सुझाव के लिए धन्यवाद; DecentXML निश्चित रूप से ध्यान में रखने के लिए एक अच्छी बात की तरह दिखता है! * बुकमार्क * यह देखने के लिए अच्छा है कि "अभी तक एक और पार्सर" परियोजनाओं में से कम से कम एक मौजूद होने का वास्तव में एक अच्छा कारण है। हालांकि, मेरी वर्तमान समस्या के लिए, मैं अपने प्रोसेसिंग कोड में मानक डीओएम एपीआई के साथ ज्यादा रहूंगा, और बस आउटपुट चरण में लाइन जोड़ूंगा। –

+0

फिर रूट तत्व से पहले आपको पाठ नोड्स मैन्युअल रूप से जोड़ने की आवश्यकता है। दस्तावेज़ ऑब्जेक्ट को सामान्य (गैर-तत्व) नोड्स को जोड़ने का तरीका देखें। यदि यह संभव नहीं है, तो आपको लेखक/आउटपुट स्ट्रीम के लिए एक फ़िल्टर बनाना होगा जो वहां की नई लाइन हैक करता है। –

+0

@AaronDigulla :: क्या आप इस http://stackoverflow.com/questions/30940162/dom-parser-wrong-childnodes-count – user3930361

0

मैं क्रिस और टॉमलाक से सहमत हूं, रिक्त रेखा एक्सएमएल बिंदु से प्रासंगिक नहीं है। यदि आपके आवेदन को आउटपुट में रिक्त रेखा उत्पन्न करने की आवश्यकता है, तो मैं उस आवश्यकता की आवश्यकता की समीक्षा करने का सुझाव दूंगा।

वैसे भी, यदि आप अभी भी उस खाली रेखा को दिखाना चाहते हैं, तो मैं उस XML पार्सर का स्रोत कोड डाउनलोड करने का सुझाव दूंगा जिसका आप उपयोग कर रहे हैं और उस व्यवहार को संशोधित करें। लेकिन ध्यान रखें कि यह मानक एक्सएमएल नहीं है और यह अन्य अनुप्रयोगों के साथ संगत नहीं होगा।

+1

पर मेरी सहायता कर सकते हैं XML फ़ाइलों के बारे में क्या है जो मनुष्यों द्वारा संपादित किए जाने वाले हैं? उस स्थिति में मूल स्वरूपण महत्वपूर्ण है। एक्सएमएल न केवल क्रमबद्धता के लिए है, अगर यह एक बाइनरी प्रारूप बेहतर होगा। – MarioVilas

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