нужна помощь javascript / ajax - PullRequest
0 голосов
/ 27 октября 2010

Как я могу получить объект документа из этого?

var xmlobject = (new DOMParser()).parseFromString(xmlstring, "text/xml");

1 Ответ

1 голос
/ 27 октября 2010

В вашем примере xmlobject - это объект документа, в соответствии с MDC . Согласно w3schools , в IE вам нужно использовать объект ActiveX, специфичный для IE, вместо DOMParser:

var xmlDoc, parser;
if (window.DOMParser) {
    parser = new DOMParser();
    xmlDoc = parser.parseFromString(text,"text/xml");
}
else { // Internet Explorer
    xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async="false";
    xmlDoc.loadXML(text); 
}

Вы сказали, что getElementById не работает. Обратите внимание, что id не является специальным атрибутом (атрибутом типа "ID") в XML по умолчанию, поэтому даже если вы даете элементам атрибут id, getElementById не будет работать (он должен возвращать null). Подробности в W3C документах для getElementById. Я никогда не делал этого, но я предполагаю, что вы назначите атрибуту тип ID через DTD.

Однако без него вы можете использовать другие механизмы обхода. Например ( живая копия ):

var xmlDoc, parser, text, things, index, thing;

text =
    '<test>' +
    '<thing>Thing 1</thing>' +
    '<thing>Thing 2</thing>' +
    '</test>';
if (window.DOMParser) {
    parser = new DOMParser();
    xmlDoc = parser.parseFromString(text,"text/xml");
}
else { // Internet Explorer
    xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async="false";
    xmlDoc.loadXML(text); 
}
things = xmlDoc.documentElement.getElementsByTagName('thing');
for (index = 0; index < things.length; ++index) {
    thing = things.item(index);
    display(index + ": " + getText(thing));
}

... где getText:

function getText(element) {
    return textCollector(element, []).join("");
}
function textCollector(element, collector) { 
    for (node = element.firstChild; node; node = node.nextSibling) { 
        switch (node.nodeType) { 
            case 3: // text 
            case 4: // cdata 
            collector.push(node.nodeValue); 
            break; 
          case 8: // comment 
              break; 
          case 1: // element 
            if (node.tagName == 'SCRIPT') { 
                break; 
            } 
            // FALL THROUGH TO DEFAULT 
            default: 
            // Descend 
            textCollector(node, collector); 
            break; 
        } 
    }
    return collector;
}   

(getText - хороший пример того, почему я использую такие библиотеки, как jQuery , Closure , Prototype , YUI или любой из нескольких других для этого материала. Вы могли бы подумать, что было бы просто получить текст внутри элемента, и равно , если элемент имеет ровно один текстовый узел внутри него [ как это делают наши thing выше. Если это не так, ну, быстро усложняется .)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...