Преобразование xml в строку с помощью jQuery

Я загружаю файл xml с помощью загрузчика jQuery ajax, и мне нужно преобразовать его в строку, чтобы я мог снова сохранить его, используя пост-переменные PHP. Как лучше всего это сделать?

<script type='text/javascript'>

jQuery.ajax({
    type: "GET",
    url: "data.xml",
    dataType: "xml",
    success: parseXML
    });


function parseXML(xml) {

    var xml_string = jQuery(xml).text();  // (This doesn't work- returns tagless, unformatted text) 
    alert(xml_string);

}

</script>

person Yarin    schedule 28.06.2011    source источник
comment
А как насчет jQuery(xml).html()? Или просто xml?   -  person Blindy    schedule 28.06.2011
comment
Вы хотите извлечь определенные строки из xml или просто получить строку xml, которая возвращается из запроса AJAX?   -  person Ryan Gross    schedule 28.06.2011
comment
@Ryan- первый- хотя я буду сохранять весь документ xml, мне нужно сначала выполнить над ним манипуляции, поэтому мне нужно ввести его как xml   -  person Yarin    schedule 28.06.2011
comment
@Blindy- Вы не можете использовать .html() в xml, и просто xml возвращает = [object Document]   -  person Yarin    schedule 28.06.2011
comment
Если вам не нужно анализировать XML и просто получать текст, измените тип данных на «текст».   -  person Ahmed Nuaman    schedule 28.06.2011
comment
Правильно, так что все равно загрузите его как «текст», вы получите его как строку. Затем вы можете разобрать XML, выполнив $( xmlString ) и бац!   -  person Ahmed Nuaman    schedule 29.06.2011
comment
вы всегда можете добавить его в родительский тег, а затем получить html родительского тега $('‹parentTag/›').append(xml).html()   -  person TheJediCowboy    schedule 28.01.2013
comment
Обратите внимание: если единственное, что вы хотите сделать с XML, это отобразить его, то console.log(xml); будет работать лучше. В Firebug и его аналогах вы можете просматривать дерево XML-документов вместо того, чтобы расшифровывать сложную строку (при условии, что она может стать несколько длинной).   -  person Alexis Wilke    schedule 30.01.2016


Ответы (9)


Вот:

<script type='text/javascript'>

function xmlToString(xmlData) { 

    var xmlString;
    //IE
    if (window.ActiveXObject){
        xmlString = xmlData.xml;
    }
    // code for Mozilla, Firefox, Opera, etc.
    else{
        xmlString = (new XMLSerializer()).serializeToString(xmlData);
    }
    return xmlString;
}   

</script>

Взято из здесь

person Yarin    schedule 28.06.2011
comment
Я заметил, что получил ошибку безопасности в Firefox при передаче объекта jQuery в эту функцию, но, похоже, он работал нормально при передаче объекта XML. - person Justin Ethier; 16.05.2012
comment
NS_ERROR_XPC_BAD_CONVERT_JS: Could not convert JavaScript argument arg 0 [nsIDOMSerializer.serializeToString] ошибка в firefox, не работает и в IE - person u.gen; 26.10.2012
comment
для тех, кто в наши дни смотрит на это решение, тест браузера должен быть не для IE, он должен быть для наличия XMLSerializer, поскольку он есть в более новом IE, но не старше. - person BobbyTables; 17.07.2015

это работает с проблемой .innerHtml.

$('<div>').append(xmlObj).html()
person Gojko Adzic    schedule 08.04.2013
comment
Это хорошо, но убивает корпус на бирках. (Особенно заметно в запросах SOAP.) ‹LogOnResponse›, потому что ‹logonresponse› - person Richard; 26.06.2013
comment
Если в вашем дереве DOM есть только теги нижнего регистра, этот подход лучше, чем подход Serializer, поскольку Serializer может изменять теги со своим собственным пространством имен по желанию. В моем конкретном случае подход Serializer не возвращал правильную строку xml, но подход $.html возвращал. - person Michael Gollmick; 17.01.2014
comment
Майкл, не могли бы вы объяснить, что $.html много борется с чувствительностью к регистру - person Laxminarayana Challagonda; 27.03.2014

Это сработало для меня (кредит: http://www.ibm.com/developerworks/xml/tutorials/x-processxmljquerytut/section3.html):

 function getXmlAsString(xmlDom){
      return (typeof XMLSerializer!=="undefined") ? 
           (new window.XMLSerializer()).serializeToString(xmlDom) : 
           xmlDom.xml;
 }          

Вот пример получения информации о столбце из списка SharePoint:

var soapEnv =
    "<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'> \
        <soapenv:Body> \
             <GetList xmlns='http://schemas.microsoft.com/sharepoint/soap/'> \
                <rowLimit>0</rowLimit> \
                <listName>Announcements</listName> \
            </GetList> \
        </soapenv:Body> \
    </soapenv:Envelope>";


jQuery.support.cors = true; 
$.ajax({
    url: "http://sharepoint/_vti_bin/lists.asmx",
    type: "POST",
    dataType: "xml",
    data: soapEnv,
    contentType: "text/xml; charset=\"utf-8\"",
    complete: function(xData){
        var xmlDoc = $.parseXML(xData.responseText), $xml = $(xmlDoc)           
        $Fields = $xml.find("Field");
        $field = $Fields.filter("Field[Name='Title']")[0];

        //Show the xml
        alert(getXmlAsString( xmlDoc ));
        alert(getXmlAsString( $field ));
    }
});
person Ben    schedule 04.06.2013

Потратил много времени на эту проблему. В IE 9 вышеуказанные функции должны работать по-другому. Потому что в IE9 xmlData[0].xml не работает (IE по-прежнему любит шутки). И мы должны использовать XMLSerializer с IE v9 и выше (?!)

function xmlToString(xmlData) { // this functions waits jQuery XML 

    var xmlString = undefined;

    if (window.ActiveXObject){
        xmlString = xmlData[0].xml;
    }

    if (xmlString === undefined)
    {
        var oSerializer = new XMLSerializer();
        xmlString = oSerializer.serializeToString(xmlData[0]);
    }

    return xmlString;
}

И пример использования с jQuery 1.8.2 (1.6.4 тоже работает).

   $.ajax(
        {
            type: type,
            url: url,
            data: values,
            dataType: 'html', //get response in plain text
            success: function(response) {    

                //transform it to jQuery XML DOM
                var xmlDoc = jQuery.parseXML(response);
                var xml = $(xmlDoc);

                //do some search and so on
                var divtag = xml.find('div[id="content"]');
                var divtxt = xmlToString(divtag);

                //consume it
                alert(divtxt);
                $('#main-content').html(divtxt);

            }
        });
person Michael T    schedule 07.11.2012
comment
хороший человек! этот код var Serializer = new XMLSerializer(); xmlString = oSerializer.serializeToString(xmlData[0]); анализирует XML в строку в IE9 - person Juan Stoppa; 25.06.2014

Была та же проблема - xmlString возвращал пустую строку. Добавление [0] к селектору jQuery помогло обратиться к объекту XML-типа:

Ваш Javascript:

<script type='text/javascript'>
function xmlToString(xmlData) 
{
    var xmlString;
    //IE
    if (window.ActiveXObject){
        xmlString = xmlData.xml;
    }
    // code for Mozilla, Firefox, Opera, etc.
    else{
        xmlString = (new XMLSerializer()).serializeToString(xmlData[0]);
    }
    return xmlString;
}   
</script>

jQuery:

<script>
$(function(){ 
  xmlData = "<tag>just a sample here</tag>"; 
  xmlData= $(xmlData); 
  if (window.ActiveXObject){ 
    var xmlString = xmlData.xml; 
  } else {
    var oSerializer = new XMLSerializer(); 
    var xmlString = oSerializer.serializeToString(xmlData[0]);
  } 
  console.log(xmlString); 
})
</script>
person Andy Widdess    schedule 29.06.2012
comment
На самом деле, чтобы правильно анализировать XML с помощью jQuery, вы хотите использовать jQuery.parseXML(xml). - person Alexis Wilke; 29.01.2015
comment
после того, как let inputXObject = $.parseXML(...) создал объект (новый XMLSerializer()).serializeToString(inputXObject) возвращает только xml, не отформатированный (также Windows 7, Chrome, консоль Chrome) - person Sasha Bond; 10.06.2018

Вы можете использовать следующую функцию:

function getXmlString($xmlObj)
{   
    var xmlString="";
    $xmlObj.children().each(function(){
        xmlString+="<"+this.nodeName+">";
        if($(this).children().length>0){
            xmlString+=getXmlString($(this));
        }
        else
            xmlString+=$(this).text();
        xmlString+="</"+this.nodeName+">";
    });
    return xmlString;
}

Передайте объект jquery xml этой функции

person Sujan Shrestha    schedule 25.02.2013
comment
это будет иметь ужасную производительность с большими деревьями. Если вы настаиваете на сериализации себя, вы должны поместить текстовые фрагменты в массив и только .join('') один раз в конце. - person epeleg; 22.07.2013

Старый пост, который я знаю, но подумал, что могу предложить это:

xml[0].outerHTML
person Mr AH    schedule 14.07.2014
comment
Зачем XML-документу иметь поле с именем outerHTML? - person Alexis Wilke; 29.01.2015
comment
Это не документ XML, это объект jQuery. - person Armand; 18.09.2015
comment
объект xml не имеет его. вы можете использовать xml.documentElement.outerHTML, но он возвращает неформатированную строку xml - person Sasha Bond; 10.06.2018

В моем случае

if(window.ActiveXObject){
    xmlString = xmlData.xml;
}

Не работает. Это проблема с IE10.

Итак, я могу решить эту проблему следующим образом:

if(window.ActiveXObject){
    xmlString = xmlData.attr('xml');
}

И нормально работает с любым браузером.

person Ajeet Kumar Singh    schedule 27.09.2013

Просто получите доступ к xml как к значению атрибута объекта jQuery. так просто, как, что.

person Purushotham Racharla    schedule 31.12.2013
comment
Должен быть комментарий, вот так просто. Если ответите, то хотя бы пример приведите. - person flawyte; 31.12.2013