konto usunięte

Temat: parser

Cześć,

nie posiadam dużego doświadczenia w JavaScript więc chciał bym Wam zadać pytanie ;-)

Posiadam np. taką strukturę danych ( obiekt string ) na wejściu

<ul><li>foo</li></ul>

na wyjściu muszę otrzymać np.

<ol><qw>foo</qw></ol>

Podsumowując jak najprościej napisać parser HTML'a do innego formatu. Muszę po prostu nadpisywać tagi HTML'a na tagi np. XML? Interesują mnie rozwiązania oparte o czysty JavaScript, bez dodatkowych bibliotek. W jaki sposób to elegancko rozwiązać? Mam kilka koncepcji jednak wolałem zapytać specjalistów ;)

konto usunięte

Temat: parser

var input = '<ul><li>foo</li></ul>';

function customParse(input) {
input.replace(/ul/g, 'ol');
input.replace(/li/g, 'qw');
...
input.replace(...);

return input;
}

Najprostsze rozwiązania bywają najlepsze :) Jeśli mniej więcej znasz strukturę pliku/ciągu wejściowego to nie ma tutaj większej filozofii. Upakować to ładnie w funkcję, ew. przekazać w parametrach opcje parsowania (co na co ma się zamieniać) i po robocie ;)

konto usunięte

Temat: parser

Najprostsze rozwiązania bywają najlepsze :)

Zgadzam się, jednak powyższe jest zbyt proste:
'<ul><li>szalik</li></ul>'.replace(/li/g, 'qw'); //<ul><qw>szaqwk</qw></ul>

:)

konto usunięte

Temat: parser

Także myślałem o metodzie replace ;-) No cóż, zobaczymy ponieważ na wejściu mogę otrzymać bardzo duży obiekt stringa.

konto usunięte

Temat: parser

Osobiście nie bawił bym się w replace z uwagi na to że jest kupa rzeczy które mogą pójść źle.
Nie lepiej lecieć rekurencyjnie po strukturze którą masz i odtwarzać ją zamieniając tagi ?

Wykorzystac document.getElementBy*, element.childNodes itp i oczywiście element.tagName i zwyczajnie jeżeli do zmiennej "test" złapaliśmy element dokumentu HTML to wtedy:


// parent - aktualny rodzic test
// test - złapany element html

var newElement;
var newTag;
switch(test.tagName) {
case 'ul': newTag = 'ol'; break;
case 'li': newTag = 'qw'; break;
etc...
}
newElement = document.createElement(newTag);
parent.appendChild(newElement);


Zrobić z tego funkcję, lecieć po elementach na pętli i puścić jako rekurencję. Właściwie jedyny moment kiedy to może zawieść to wtedy kiedy dokument będzie nieprawidłowy a przeglądarka go w jakiś sposób nie poprawi.

konto usunięte

Temat: parser

Dzięki za odpowiedź.

Dokładnie mówiąc prasuje HTML'a na RML'a - struktura bardzo się różni.

RML - http://www.reportlab.com/
Piotr Koszuliński

Piotr Koszuliński JavaScript ninja

Temat: parser

Zgadzam się z tym, że użycie regexpa w replace to zbytnie uproszczenie. Wystarczy sprawdzić odpowiedzi na te dwa pytania: http://stackoverflow.com/questions/1732348/regex-match... http://stackoverflow.com/questions/590747/using-regula...

W skrócie - Regexpa można użyć jedynie do gramatyki regularnej, a HTML jest bez kontekstową.

Nie wiem do końca ile różnych transformacji chcesz zastosować i na jak skomplikowanym HTML-u oraz czy np. ten HTML może być niepoprawny, albo czy interesuje Cię też IE. Orientuję się jak działa parser z filtrem naprawiającym HTML w CKEditorze i generalnie miałby on interesujące Cię możliwości (można pisać dowolne filtry modyfikujące pseudo-DOM i serializować to). Z tym że jest tam też milion rzeczy, które zapewne Cię nie będą interesowały. W najprostszym przypadku rzeczywiście możesz użyć rozwiązania jakie zaproponował Darek. Jeśli jednak masz więcej wymagań oraz musisz obsłużyć wątpliwej jakości HTML, to takie rozwiązanie może być niewystarczające/niewygodne.

Daj znać czego potrzebujesz, to postaram się podać więcej szczegółów.

konto usunięte

Temat: parser

Dzięki za odpowiedź jednak struktura HTML mnie nie interesuje czy jest poprawna ( np. pod IE ) ponieważ przebudowuje strukturę na RML'a, który jest rozszerzeniem XML'a.

Dzięki za odpowiedzi, poradziłem sobie ;-)
Mirosław Ratman

Mirosław Ratman Manager IT,
Architekt systemów
@Avast, Founder
@aSyncro ...

Temat: parser

Tak na koniec małe porównanie (dlaczego czasami nie używać frameworków): http://jsperf.com/replace-tag-names

konto usunięte

Temat: parser

Mirosław R.:
Tak na koniec małe porównanie (dlaczego czasami nie używać frameworków): http://jsperf.com/replace-tag-names

Po części racja ale w większości przypadków jak dodasz ile czasu trzeba spędzić nad zachowaniem kompatybilności z IE to się zdziwisz jak bardzo można kilka milisekund poświęcić żeby to po prostu napisać szybciej.

Nie wiem jak inni ale jeżeli operuję na DOM przy czymś co ma pracować w IE i robię to z jQuery z jakiegoś powodu to po czysty HTML sięgam tylko wtedy jak wydajność czegoś rzeczywiście stanowi problem w IE.
Jednak jeżeli nie muszę zachowywać kompatybilności ze starszymi IE to wolę sięgnąć po selector API.

https://developer.mozilla.org/en-US/docs/DOM/Document.q...

konto usunięte

Temat: parser

Dariusz Półtorak:
Nie wiem jak inni ale jeżeli operuję na DOM przy czymś co ma pracować w IE i robię to z jQuery z jakiegoś powodu to po czysty HTML sięgam tylko wtedy jak wydajność czegoś rzeczywiście stanowi problem w IE.
Inni nie zawsze korzystają z jQuery :)
Piotr Koszuliński

Piotr Koszuliński JavaScript ninja

Temat: parser

Mi tam wersja native DOM wali soczystym czerwonym errorem :P jQuery może i powoli, ale się wykonuje.

Najważniejsza zasada to ta, która mówi, żeby nie optymalizować przedwcześnie i optymalizować to co najwięcej czasu zajmuje (nie mylić z "najwolniejsze"). I tyle w temacie.

konto usunięte

Temat: parser

Piotr Koszuliński:
Mi tam wersja native DOM wali soczystym czerwonym errorem :P jQuery może i powoli, ale się wykonuje.
O dziwo u mnie też.
Najważniejsza zasada to ta, która mówi, żeby nie optymalizować przedwcześnie i optymalizować to co najwięcej czasu zajmuje (nie mylić z "najwolniejsze"). I tyle w temacie.
Z tym nie można się nie zgodzić, kto się bawił profilowaniem ten wie :)

konto usunięte

Temat: parser

Mirosław R.:
Tak na koniec małe porównanie (dlaczego czasami nie używać frameworków): http://jsperf.com/replace-tag-names
w 90% przypadków czas programisty > czas komputera (a porównaj ile kodu trzeba było napisać dla obu rozwiązań; gdyby to była większa strona to ktoś by się zasiedział, zwłaszcza chcąc wspierać starsze przeglądarki). Co nie znaczy, że jak ktoś ma kasę to nie może polecieć w czystym JS (vide Facebook czy Gmail)

konto usunięte

Temat: parser

Piotr Koszuliński:
Mi tam wersja native DOM wali soczystym czerwonym errorem :P jQuery może i powoli, ale się wykonuje.

Najważniejsza zasada to ta, która mówi, żeby nie optymalizować przedwcześnie i optymalizować to co najwięcej czasu zajmuje (nie mylić z "najwolniejsze"). I tyle w temacie.

"Premature optimization is never good, it's like premature ejaculation" :D

konto usunięte

Temat: parser

Porzuciłem JavaScript bo miałem możliwość napisania w Pythonie ;-)
Piotr Koszuliński

Piotr Koszuliński JavaScript ninja

Temat: parser

Konrad Mariusz Kur:
Porzuciłem JavaScript bo miałem możliwość napisania w Pythonie ;-)

A kysz! :P

// W sumie to lepiej w Pythonie niż w PHP.Piotr Koszuliński edytował(a) ten post dnia 08.11.12 o godzinie 16:34
Mirosław Ratman

Mirosław Ratman Manager IT,
Architekt systemów
@Avast, Founder
@aSyncro ...

Temat: parser

Kamil Brenk:

w 90% przypadków czas programisty > czas komputera (a porównaj ile kodu trzeba było napisać dla obu rozwiązań;

... a na jQuery nie poświęcono czasu ??? ;)

Temat: parser

Konrad Mariusz Kur:
Porzuciłem JavaScript bo miałem możliwość napisania w Pythonie ;-)
Hmm.. to może masz też możliwość użycia XSLT?

Rozwiązanie to sprawdziło się doskonale w projekcie nad którym pracuję w roli automatu transformującego plik XML (np taki: https://github.com/qcadoo/mes/blob/master/mes-plugins/m... ) na dokument opisujący mapowanie Hibernate (*.hbm.xml).
A tak wygląda jego (xslt) zawartość: https://github.com/qcadoo/qcadoo/blob/master/qcadoo-mod...

Być może wcale nie będziesz musiał nawet się dotykać xsl - możliwe że ktoś już wcześniej dokonywał podobnej konwersji i podzielił się efektami pracy w sieci.Marcin Kubala edytował(a) ten post dnia 08.11.12 o godzinie 17:36

konto usunięte

Temat: parser

Poradziłem sobie przy użyciu wyrażeń regularnych oraz biblioteki lxml ( python ). Tak więc nie warto zmieniać czegoś co działa szybko i dobrze ;-)

Następna dyskusja:

parser msxsl.exe, czy darmo...




Wyślij zaproszenie do