ugrás a tartalomhoz

XMLHttpRequest content-type probléma

PiG · 2004. Okt. 3. (V), 11.04
Sziasztok!

Próbálnék egy rss hírolvasót összehozni a böngészőben (persze létező kódok alapján, JavaScriptben). A weblaboron is megjelent cikk alapján az XmlExtras csomagot is használva:
function loadXMLDoc(url) {
        req = new XmlHttp.create();
        req.onreadystatechange = processReqChange;
        req.open("POST", url, true);
        req.send();
}
// onreadystatechange esemény kezelése jön
function processReqChange() {
    // csak akkor, ha "loaded"
    if (req.readyState == 4) {
        // csak, ha "OK"
        if (req.status == 200) {
            alert(req.getResponseHeader("Content-Type"));//csak a teszt miatt van itt
            clearTopicList();
            buildTopicList();
         } else {
            alert("Hiba történt az XML adatok beolvasásakor:\n"+                req.statusText);
         }
    }
}

Namármost a gondom a következő:
Ha Weblabor feedet (http://weblabor.hu/rss) adom meg, akkor a content-type text/xml;charset=utf-8. Ha a valamelyik A List Apart feedet pl.: (http://www.alistapart.com/articles.xml), akkor a content-type értéke application/rss+xml.
Nos, ez még nem lenne baj, mondhatjátok. Ha azonban magát a feedet szeretném olvasni:
var items = req.responseXML.getElementsByTagName("item");
//itt persze még folytatódik a kód, de a lényeg ez

akkor a weblaboros szépen "bejön", a listapartos meg nem. Annyit már kiderítettem, hogy a listapartos feednél nincs responseXML objektum - ezt csakis a content-type különbözőségére tudom visszavezetni, ugyanis mindkettő esetében van responseText objektum, tehát a kérések rendben megtörténtek, csak a weblabor estében xml dokumentumként a másikban meg szövegként értelmezi a választ, bár a szerkezete megfelel egy XML dokumentum szerkezetének. Csakhogy a responseText objektumot nem tudom XML-ként kezelni, tehát a getElementsByTagName nem használható.
Kérdéseim:
  1. Meg tudom-e változtani a content-type-ot a művelet folyamán?
  2. Ha nem, miként tudom a responseText estében a kapott választ XML dokumentumként kezelni
  3. A responseStream és a responseBody megoldást jelenthet-e a problémára, érdemes-e azokkal is kísérletezni (szenvedni)

Remélem van ember, aki tud segíteni! Előre is köszi:
P][G
 
1

XMLHttpRequest részleges megoldás

PiG · 2004. Okt. 3. (V), 20.53
A fent vázolt probléma megoldására a következő kód működőképesnek látszik, bár megmondom őszintén jókora adag próbálgatás van benne, és nem igazán tartom tökéletes megoldásnak. Mindenesetre a feed-ből az <item> tag-eket kiolvassa mindkét fent vázolt esetben.
if (req.responseXML.text==null || req.responseXML.text==""){
        var xmldoc=XmlDocument.create();
        xmldoc.loadXML(req.responseText);
        var items = xmldoc.getElementsByTagName("item");
    }
    else{
        var items = req.responseXML.getElementsByTagName("item");
    }

Ha vki esetleg tudna valami jobb megoldást, illetve magyarázatot az eredeti hozzászólásban leírtakra, azt továbbra is köszönettel veszem - már, ha vki egyáltalán olvassa ezt a fórumot :-/
Sziasztok:
P][G
2

Választ nem tudok...

Bártházi András · 2004. Okt. 4. (H), 08.18
Választ ugyan nem tudok, de a kódot egyszerűsíteni lehetne, ha csak a responseText-tel foglalkoznál, abból gyártanál mindig egy xmldoc-ot. Nem hiszem, hogy nagyon nagy teljesítményveszteség lenne.

-boogie-
3

Nem fogod elhinni, de próbá

PiG · 2004. Okt. 4. (H), 08.39
Nem fogod elhinni, de próbáltam :-) Akkor meg a "rendes" weblaboros text/xml feedet nem olvassa.... hehe
P][G
4

...egyébként csak elvi jell

PiG · 2004. Okt. 4. (H), 09.05
...egyébként csak elvi jellegű a probléma, mert gyakorlatban az IE folyton biztonsági kérdésekkel nyaggat, mivel más domainból szeretnék httprequest-tel olvasni. Ezt még le tudom "igenezni", de a Mozilla kérdését még nem sikerült kitrükközni, ott ugyanis - ha jól értem, aláírt script kell, azt meg ölég bonyi összehozni.
A végleges megoldást amúgy php-vel karöltve tervezem, ugyanis - terveim szerint, ha fpassthru-val olvastatom ki az eredeti feedet, és ennek az eredményét kérem le az xmlhttprequesttel, akkor az uannak a domainnek fogja hinni - remélem... szóval a forrás nem weblabor.hu/akarmi.xml lesz, hanem mondjuk www.ugyanazadomain.hu/feedreader.php?id=1, persze tömbben vagy adatbázisban tárolva az id-nek megfelelő feed. Így a php-ben reményeim szerint egy header elküldéssel be tudom állítani a content-type-ot. Persze ez még csak elméleti okoskodás, lehet, hogy a gyakorlatban egyáltalán nem fog menni...
P][G
5

Újabb XML gondok!

PiG · 2004. Okt. 5. (K), 19.52
Ha vki netán elolvassa az előzőekben vázolt problémát, akkor tudja, hogy éppen milyen "projecten" szenvedek.
Nos ismét gondjaim adódnak a Content-type-al. Próbaképpen helyi webszerveren keresztül (localhost) szeretnék xml feed-et letölteni az XmlHttpRequest segítségével. A szerver egy KFWS, Mime szekciójában a text/xml van beállítva az xml, xsl és dtd file-okra. DE: hiába próbálnám beolvasni az xml file-t vmiért a kis szemét direkt nem text/xml-ként szolgálja ki, hanem text/html-ként. Innentől kezdve persze cseszhetem.
Kérdés miért van ez?
Kérdés kettő: miért esküszik össze állandóan minden technika az ember ellen?
Nem űrhajót akarok építen, csak egy nyamvadt szöveges file-ból kiolvasni adatokat. Ha loadXMLDoc-kal töltök be xml dokot nincs valami forceContentType vagy ilyesmi beállítás? Ha nincs miért nincs? A több ezer fejlesztő közül soha senkinek nem jutott eszébe? Mindig azon kapom magam, amikor valami hót eccerű dolgot szeretnék megoldani, hogy direkte nem lehet, valami olyan hülye viselkedés miatt, amik úgy látszik a több millió komputterfelhasználó közül még senkivel nem fordult elő - mert ha előfordult volna, gondolom már lenne rá megoldás.
Na, mindegy. A konkrét kérdéseimre konkrét válaszokat adókat meghívom, hogy vegyenek a saját pénzükön kedvenc csokijukból egy táblát, majszolása közben pedig hassa át őket a segítségadás felett miatt érzett lélekemelő öröm...
Sziasztok:
P][G
6

setRequestHeader

gellert · 2004. Nov. 9. (K), 01.47
Nem próbálnád meg a setRequestHeader elemfüggvényt? Ha felülírod a MIME típusát, nem jön létre a responseXML objektum?