2010-06-06 20 views
18

मैं वेब विकास में एक नौसिखिया हूं, और मैं अपनी एक्सएमएल फ़ाइल में लाइन ब्रेक डालने की कोशिश कर रहा हूं।एक्सएमएल में लाइन ब्रेक?

<musicpage> 
    <song> 
     <title>Song Title</title> 
     <lyric>Lyrics</lyric> 
    </song> 

    <song> 
     <title>Song Title</title> 
     <lyric>Lyrics</lyric> 
    </song> 

    <song> 
     <title>Song Title</title> 
     <lyric>Lyrics</lyric> 
    </song> 

    <song> 
     <title>Song Title</title> 
     <lyric>Lyrics</lyric> 
    </song> 
</musicpage> 

मैं लाइन बोल वाक्य के बीच में टूट जाता है करना चाहते हैं: यह मेरा एक्सएमएल दिखता है की तरह है। मैंने सब कुछ/n, और इसके समान अन्य कोड, PHP पार्सिंग इत्यादि से कोशिश की, और कुछ भी काम नहीं करता! घंटों के लिए ऑनलाइन गुगल रहा है और जवाब नहीं मिल रहा है। मैं जावास्क्रिप्ट का उपयोग कर एक HTML पृष्ठ पर डेटा डालने के लिए एक्सएमएल का उपयोग कर रहा हूं।

क्या कोई इस समस्या को हल करने के बारे में जानता है?

<script type="text/javascript"> 

    if (window.XMLHttpRequest) { 
    xhttp=new XMLHttpRequest(); 
} else { 
    xhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
} 
xhttp.open("GET","xml/musicpage_lyrics.xml",false); 
xhttp.send(""); 
xmlDoc=xhttp.responseXML; 

var x=xmlDoc.getElementsByTagName("songs"); 
for (i=0;i<x.length;i++) { 
    document.write("<p class='msg_head'>"); 
    document.write(x[i].getElementsByTagName("title")[0].childNodes[0].nodeValue); 
    document.write("</p><p class='msg_body'>"); 
    document.write(x[i].getElementsByTagName("lyric")[0].childNodes[0].nodeValue); 
    document.write("</p>"); 
} 
</script> 
+0

कृपया कुछ कोड पोस्ट करें जो दिखाते हैं कि आप XML का उपयोग कैसे कर रहे हैं। –

+1

क्या आप एक चीज़ को स्पष्ट कर सकते हैं? क्या आपको एक्सएमएल फ़ाइल बनाने में परेशानी हो रही है (यदि आप इसे एक गूंगा पाठ संपादक में खोलते हैं, तो क्या आप देखते हैं कि आप क्या देखने की उम्मीद करते हैं?) या आपको ब्राउज़र में टेक्स्ट को प्रस्तुत करने में परेशानी हो रही है। मेरा संदेह यह है कि समस्या यह है कि ब्राउज़र एक ही स्थान के रूप में किसी भी सफेद स्थान (रिक्त स्थान, टैब, लाइन-ब्रेक इत्यादि) प्रस्तुत करते हैं, इसलिए समस्या एक्सएमएल नहीं है, यह पाठ है। ब्राउज़र में इसे प्रस्तुत करने के लिए आपको '
' (पिछला स्लैश नोट करें) जोड़ने की आवश्यकता है या आपको इसे '

' ब्लॉक पर लिखना होगा। –
                        
                            
    Andrew
                                
                            
                        
                    

+0

एक्सएमएल पेज के शीर्ष पर मैंने जो कुछ पोस्ट किया है, और मैंने जावास्क्रिप्ट कोड जोड़ा है जिसे मैं HTML डेटा को HTML पृष्ठ में डालने के लिए उपयोग करता था (बस इसकी आवश्यकता होने पर)। – ew89

उत्तर

24

@icktoofay करीब था

यहाँ एक जावास्क्रिप्ट समारोह है कि एक बहु लाइन स्ट्रिंग में <br> सम्मिलित करता है सीडीएटी

<myxml> 
    <record> 
     <![CDATA[ 
     Line 1 <br /> 
     Line 2 <br /> 
     Line 3 <br /> 
     ]]> 
    </record> 
</myxml> 
+0

पूरी तरह से काम करता है !!!बहुत बहुत धन्यवाद, ठीक वही जो मैं देख रहा था :) – ew89

+1

चूंकि आप सीडीएटीए का उपयोग कर रहे हैं, आपको वास्तविक लाइन ब्रेक की आवश्यकता क्यों है? –

+0

लाइन ब्रेक आवश्यक नहीं हैं ... मैंने उन्हें ब्रेक दिखाने के लिए वहां रखा है। इसे आसानी से एक लाइन में कम किया जा सकता है। –

1

आप CDATA का उपयोग करते हैं, तो आप एम्बेड कर सकता लाइन एक्सएमएल मुझे लगता है कि में सीधे टूट जाता है:

और यह मैं HTML पृष्ठ पर XML डेटा को सम्मिलित करने के लिए प्रयोग किया जाता जे एस कोड है। उदाहरण: &#xD;

विशेष वर्ण गाड़ी-रिटर्न चरित्र को परिभाषित करता है कि:

<song> 
    <title>Song Title</title> 
    <lyric><![CDATA[Line 1 
Line 2 
Line 3]]></lyric> 
</song> 
+0

मैंने कोशिश की, लेकिन फिर एक्सएमएल फ़ाइल सिर्फ एचटीएमएल पेज में लोड नहीं होगी (जिसके परिणामस्वरूप एक खाली जगह है जहां एक्सएमएल को लोड किया जाना चाहिए) :( – ew89

+1

यह सीडीएटीए के बिना पूरी तरह से अच्छी तरह से काम करता है। – Tomalak

7

अपने लाइनों के अंत में, बस निम्नलिखित विशेष वर्ण जोड़ें।

+0

मैंने भी कोशिश की , लेकिन कोड बस एचटीएमएल पेज में दिखाई नहीं देता है, दोनों लाइन ब्रेक और शाब्दिक टाइपिंग के रूप में, लेकिन बाकी एक्सएमएल डेटा पूरी तरह लोड हो जाता है। – ew89

+3

@ ew89: स्रोत कोड में लाइन ब्रेक में लाइन ब्रेक नहीं होता है एचटीएमएल के लिए। एचटीएमएल के लिए आप '
' टैग चाहते हैं। – Tomalak

+1

@ स्कोरचिन: आप एक साधारण शाब्दिक लाइनब्रेक का उपयोग कर सकते हैं। विशेषता मानों को छोड़कर इसे एन्कोड करने की कोई आवश्यकता नहीं है। – Tomalak

2
<song> 
    <title>Song Tigle</title> 
    <lyrics> 
    <line>The is the very first line</line> 
    <line>Number two and I'm still feeling fine</line> 
    <line>Number three and a pattern begins</line> 
    <line>Add lines like this and everyone wins!</line> 
    </lyrics> 
</song> 

यदि यह मेरा था मैं कोरस और XML तत्वों में छंद के रूप में अच्छी तरह से लपेट चाहते हैं (रेंज पर घर की धुन सुंग)।

+0

कोई बुरा विचार नहीं है, लेकिन बहुत verbose! सीडीएटीए यहाँ ठीक काम करता है। – fastcodejava

+0

@fastcodejava: आप जावा लड़के हैं और आप मुझे बताते हैं कि यह वर्बोज़ है? :) नहीं, लगभग वर्बोज़ पर्याप्त नहीं है! जैसा कि मैंने अपने संपादन में उल्लेख किया है, मैं कोरस और छंद भी लपेटूंगा। – Robusto

22

एक्सएमएल में एक लाइन ब्रेक एक सामान्य चरित्र है। आप ऐसा कर सकते हैं:

<xml> 
    <text>some text 
with 
three lines</text> 
</xml> 

और <text> की सामग्री

 
some text 
with 
three lines 

होगा यदि यह आपके लिए काम नहीं करता है, तो आप कुछ गलत कर रहे हैं। लाइन ब्रेक एन्कोडिंग जैसे विशेष "वर्कअराउंड" अनावश्यक हैं। दूसरी ओर, \n की तरह काम नहीं करेगा, क्योंकि एक्सएमएल के पास कोई बचने का अनुक्रम नहीं है *


* ध्यान दें कि &#xA; चरित्र इकाई है कि में धारावाहिक एक्सएमएल एक लाइन ब्रेक का प्रतिनिधित्व करता है। "एक्सएमएल में कोई बचने का अनुक्रम नहीं है" का अर्थ है जब आप डीओएम दस्तावेज़ के साथ बातचीत करते हैं, डीओएम एपीआई के माध्यम से नोड मान सेट करते हैं।

यह वह जगह है जहां न तो &#xA; है और न ही \n तरह बातें काम करेंगे, लेकिन एक वास्तविक न्यू लाइन चरित्र होगा। यह वर्ण धारावाहिक दस्तावेज़ (यानी "फ़ाइल") में समाप्त होता है, एपीआई तक है और आपको चिंता नहीं करनी चाहिए।


चूंकि आपको आश्चर्य होता है कि आपकी लाइन टूट जाती है HTML में: अपने स्रोत कोड में एक नज़र डालें, वहां वे हैं। एचटीएमएल स्रोत कोड में लाइन ब्रेक को अनदेखा करता है। स्क्रीन पर लाइन ब्रेक को मजबूर करने के लिए <br> टैग का उपयोग करें।

function nl2br(s) { return s.split(/\r?\n/).join("<br>"); } 

वैकल्पिक रूप से आप सीएसएस के साथ नए लाइन वर्ण में पंक्ति विराम मजबूर कर सकते हैं:

div.lines { 
    white-space: pre-line; 
} 
+0

नहीं, काम नहीं करता .. लेकिन मैं इसे और अधिक देख लूंगा। धन्यवाद! – ew89

+4

@ ew89: बेशक यह काम करता है। आप सिर्फ गलत समस्या को हल करने की कोशिश कर रहे हैं। – Tomalak

+2

यह वास्तविक जवाब है। अगर सबकुछ अच्छी तरह से काम कर रहा है, तो एक साधारण न्यूलाइन को यह करना चाहिए। कुछ पार्सर्स को व्हाइटस्पेस को चुनिंदा रूप से अनदेखा करने के लिए ध्वज होता है, ताकि आप इसे अपनी एक्सएमएल फ़ाइल इंडेंट करने के लिए उपयोग कर सकें, लेकिन मुझे संदेह है कि यह आपकी समस्या है। (जो है, आईएमएचओ, प्रारूप का दुरुपयोग।) एक्सएमएल में व्हाइटस्पेस * महत्वपूर्ण * है, जिसमें आपके द्वारा इंडेंटेशन के लिए उपयोग किए जाने वाले टैब/रिक्त स्थान शामिल हैं। – Thanatos

3

एक्सएमएल में: शाब्दिक रेखा-ब्रेक का उपयोग करें, n और कुछ और चाहिए।

न्यूस्लाइन उन्हें पढ़ने के लिए जावास्क्रिप्ट के लिए संरक्षित किया जाएगा [1]। ध्यान दें कि किसी भी इंडेंटेशन-स्पेस और पिछली या पिछली लाइन-ब्रेक भी संरक्षित हैं (कारण आप उन्हें नहीं देख रहे थे कि HTML/CSS डिफ़ॉल्ट रूप से एकल स्पेस-वर्णों में व्हाइटस्पेस को ध्वस्त कर देता है)।

तो सबसे आसान तरीका है: HTML में: कुछ भी नहीं, बस सीएसएस लाइन ब्रेक

.msg_body { 
    white-space: pre-line; 
} 

संरक्षित करने के लिए उपयोग करते हैं लेकिन यह भी XML दस्तावेज़ से अपने अतिरिक्त लाइनें को बरकरार रखता है, और काम नहीं करता है आईई 6 या 7 [2] में।

तो व्हाइटस्पेस को स्वयं साफ़ करें; (स्पष्टता के लिए लाइनब्रेक - जावास्क्रिप्ट के साथ या बिना उन्हें [3] खुश है) यह एक तरह से यह करने के लिए है [4]

[get lyric...].nodeValue 
    .replace(/^[\r\n\t ]+|[\r\n\t ]+$/g, '') 
    .replace(/[ \t]+/g, ' ') 
    .replace(/ ?([\r\n]) ?/g, '$1') 

और फिर

.msg_body { 
    white-space: pre; // for IE 6 and 7 
    white-space: pre-wrap; // or pre-line 
} 

या के साथ उन लोगों लाइनब्रेक की रक्षा, उस सीएसएस के बजाय, अन्य जावास्क्रिप्ट .replace एस के बाद .replace(/\r?\n/g, '<br />') जोड़ें।

(साइड नोट: दस्तावेज़.write() का उपयोग करना आदर्श नहीं है और कभी-कभी क्रॉस-साइट स्क्रिप्टिंग हमलों के लिए कमजोर है, लेकिन यह एक और विषय है। इस उत्तर के संबंध में, यदि आप भिन्नता का उपयोग करना चाहते हैं <br> के साथ, आप पैदा <br> रों से पहले <, & (, >, ", ') से बचने के लिए होगा)

-

[1] संदर्भ:। वर्गों "तत्व व्हाइट अंतरिक्ष हैंडलिंग "और" एक्सएमएल स्कीमा व्हाइट स्पेस कंट्रोल " http://www.usingxml.com/Basics/XmlSpace#ElementWhiteSpaceHandling

[2] http://www.quirksmode.org/css/whitespace.html

[3] जावास्क्रिप्ट के वाक्य रचना में कुछ स्थानों पर जहां अपने अर्धविराम प्रविष्टि विशेष रूप से कष्टप्रद है के लिए छोड़कर।

[4] मैंने इसे लिखा और लिनक्स Node.js में इन regexps का परीक्षण किया (जो क्रोम के रूप में एक ही जावास्क्रिप्ट इंजन का उपयोग करता है, "वी 8")। एक छोटा सा जोखिम है कुछ ब्राउज़र अलग-अलग regexps निष्पादित करता है। (मेरी टेस्ट स्ट्रिंग (जावास्क्रिप्ट सिंटैक्स में) "\n\nfoo bar baz\n\n\tmore lyrics \nare good\n\n")

+0

सफेद-स्थान: पूर्व-रेखा; - पूरी तरह से काम करता है –

2

बस अपनी लाइनों के अंत में &lt;br&gt; का उपयोग करें।

1
<description><![CDATA[first line<br/>second line<br/>]]></description> 
+1

यदि आप समझाते हैं कि इसका क्या अर्थ है तो यह एक बेहतर जवाब होगा। –

0

क्या आप display:block; उपयोग कर सकते हैं शैली (अनुशंसित नहीं है।) करने के लिए सीएसएस का उपयोग कर रहे हैं, तो हालांकि, यह केवल आप लाइन और स्टाइल तत्व के बाद से पहले टूट जाता है दे देंगे।

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