2010-06-06 15 views
18

Jestem początkujący w tworzeniu stron WWW i próbuję wstawiać podziały wierszy w moim pliku XML. To właśnie mój XML wygląda następująco:Podział wierszy w XML?

<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> 

chcę mieć podziały wiersza między zdaniami dla tekstu. Próbowałem wszystkiego od/n, i innych kodów podobnych do niego, parsowania PHP itd. I nic nie działa! Przez wiele godzin szukałem w internecie i nie mogę znaleźć odpowiedzi. Używam XML do wstawiania danych do strony HTML za pomocą Javascript.

Czy ktoś wie, jak rozwiązać ten problem?

I to jest kod JS Kiedyś wstawić dane XML do strony 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

Proszę napisać kod pokazujący, w jaki sposób korzystasz z XML. –

+1

Czy możesz wyjaśnić jedną rzecz? Czy masz problemy z budowaniem pliku XML (jeśli otworzysz go w głupim edytorze tekstu, czy widzisz, co spodziewasz się zobaczyć?) Lub masz problem z renderowaniem tekstu w przeglądarce. Podejrzewam, że problem polega na tym, że przeglądarki renderują KAŻDĄ białą przestrzeń (spacje, tabulatory, linie podziału, itp.) Jako pojedynczą przestrzeń, więc problemem nie jest XML, to tekst. Musisz dodać '
' (zwróć uwagę na końcowy ukośnik), aby był renderowany w przeglądarce lub musisz zapisać go w bloku '

'. –
                        
                            
    Andrew
                                
                            
                        
                    

+0

XML jest tym, co napisałem na górze strony, i dodałem kod JavaScript, który użyłem do wstawienia danych XML na stronę HTML (na wszelki wypadek). – ew89

Odpowiedz

24

@icktoofay było blisko z CData:

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

DZIAŁA PERFEKCYJNIE !!!Dziękuję bardzo, dokładnie to, czego szukałem :) – ew89

+1

Skoro używasz CDATA, dlaczego potrzebujesz rzeczywistych podzadań linii? –

+0

Podziały linii nie są konieczne ... Po prostu umieszczam je, aby pokazać przerwy. Można go łatwo zredukować do pojedynczej linii. –

1

Jeśli używasz CDATA, można osadzić linia łamie bezpośrednio do XML myślę. Przykład:

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

Próbowałem, ale wtedy plik XML nie byłby ładowany na stronę HTML (w wyniku czego puste miejsce, do którego powinien być załadowany XML) :( – ew89

+1

Działa to doskonale bez CDATA. – Tomalak

7

Pod koniec swoich linii, po prostu dodaj następujący znak specjalny: &#xD;

To szczególny charakter definiuje znak powrotu karetki.

+0

Próbowałem też , ale kod po prostu nie pojawia się na stronie HTML, zarówno jako podział wiersza, jak i literał, ale reszta danych XML ładuje się idealnie. – ew89

+3

@ ew89: Podział linii w kodzie źródłowym nie powoduje powstawania linii w linii renderowany HTML Dla HTML potrzebujesz znaczników '
' – Tomalak

+1

@Scorchin: Możesz użyć prostego dosłownego linebreaka Nie ma potrzeby kodowania go poza wartościami atrybutów – 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> 

(Sung do melodii Home on the Range)

Jeśli to kopalnia bym owijania refreny i zwrotki w elementach XML, jak również.

+0

Niezły pomysł, ale zbyt szczegółowy! CDATA działa tutaj dobrze. – fastcodejava

+0

@fastcodejava: Jesteś facetem Javy i mówisz mi, że to jest gadatliwe? :) Nie, prawie wystarczająco gadatliwy! Jak wspomniałem w mojej edycji, chowałem również refreny i wersety. – Robusto

22

W XML podział wiersza jest normalnym znakiem. Można to zrobić:

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

i zawartość <text> będzie

 
some text 
with 
three lines 

Jeśli to nie zadziała, robisz coś złego. Specjalne "obejścia", takie jak kodowanie łamania linii, są niepotrzebne. Rzeczy takie jak \n nie będą działały z drugiej strony, ponieważ XML nie ma sekwencji unikowych *.


* Zauważ, że &#xA; jest podmiotem znak, który oznacza koniec linii w serializowanym XML. "XML nie ma sekwencji ucieczki" oznacza sytuację, w której użytkownik wchodzi w interakcję z dokumentem DOM, ustawiając wartości węzłów za pomocą interfejsu DOM API.

To gdzie ani &#xA; ani rzeczy jak \n będzie działać, ale rzeczywisty znak nowej linii będzie. W jaki sposób ta postać trafia do serializowanego dokumentu (np. "Plik") należy do API i nie powinno Cię to obchodzić.


Ponieważ wydaje się zastanawiać, gdzie podziały wiersza iść w HTML: Spójrz do kodu źródłowego, nie są. HTML ignoruje podziały wierszy w kodzie źródłowym. Użyj znaczników <br>, aby wymusić łamanie linii na ekranie.

Oto funkcja JavaScript, który wstawia <br> na ciąg multi-line:

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

Alternatywnie można wymusić przerw wiersz na nowe znaki zgodne z CSS:

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

nie, nie działa ... ale przyjrzę się temu więcej. Dzięki! – ew89

+4

@ ew89: Oczywiście, że działa. Próbujesz rozwiązać niewłaściwy problem. – Tomalak

+2

To jest prawdziwa odpowiedź. Jeśli wszystko działa dobrze, powinien to zrobić prosty znak nowej linii. Niektóre parsery mają flagę do selektywnego ignorowania białych znaków, dzięki czemu możesz użyć jej do zindentowania pliku XML, ale wątpię, żeby to był twój problem. (co jest, IMHO, nadużycie formatu.) Białe spacje w XML są * znaczące *, w tym tabulacje/spacje używane do wcięcia. – Thanatos

3

W języku XML: użyj literalnych linii podziału, n potrzebował jeszcze czegoś.

Nowe linie zostaną zachowane w celu odczytania ich przez Javascript [1]. Zauważ, że wszystkie przestrzenie wcięć i poprzedzające lub końcowe podziały wierszy również są zachowywane (powodem, dla którego ich nie widziałeś, jest to, że HTML/CSS domyślnie zawija znaki białe na spacje).

Wtedy najłatwiej jest: W HTML: nic nie robić, po prostu użyć CSS, aby zachować line-przerw

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

Ale to zachowuje również swoje dodatkowe linie z dokumentu XML, a nie działa w IE 6 lub 7 [2].

Sam posprzątaj białą przestrzeń; To jeden ze sposobów, aby to zrobić (linebreaks dla jasności - JavaScript jest zadowolony z lub bez nich) [3] [4]

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

a następnie zachować te linebreaks z

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

lub, zamiast tego CSS dodaj .replace(/\r?\n/g, '<br />') po innych JavaScript .replace s.

(Uwaga: używanie document.write() nie jest również idealne i czasami jest podatne na ataki cross-site scripting, ale jest to inny temat. W odniesieniu do tej odpowiedzi, jeśli chcesz użyć wariantu, który zastępuje z <br>, trzeba uciec <, & (, >, ", ') przed generowania <br> s)

-

[1] odniesienia. sekcje „Element Owiatło Handling "i" Schemat XML White Space Control " http://www.usingxml.com/Basics/XmlSpace#ElementWhiteSpaceHandling

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

[3], z wyjątkiem kilku miejscach składni Javascript w którym jego średnik wkładania jest szczególnie uciążliwe.

[4] Napisałem i przetestowałem te wyrazy regularne w Linux Node.js (które używa tego samego silnika Javascript co Chrome, "V8"). Istnieje niewielkie ryzyko, że przeglądarka inaczej uruchamia regexps. (Mój ciąg testowy (w składni javascript) "\n\nfoo bar baz\n\n\tmore lyrics \nare good\n\n")

+0

white-space: pre-line; - działa idealnie –

2

po prostu użyj &lt;br&gt; na końcu linii.

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

To byłaby lepsza odpowiedź, gdybyś wyjaśnił, co to znaczy. –

0

Jeśli używasz CSS do stylu (nie zalecane). Można użyć display:block;, jednak będzie to tylko daje linię łamie przed i po stylizowany elementu.