2013-10-08 4 views
0

У нас есть webapp (стандартный Spring MVC, Java) - который я написал - который возвращает ответ нашему клиенту (браузеру) как XML. Ответ сортируется с использованием JAXB и так далее.Извлечение всего содержимого узла XML с использованием Javascript

Внутри ui - для взаимодействия с сторонним программным обеспечением нам необходимо передать часть XML как есть в javascript-метод.

I.e все, начиная от '<' в третьем пакете до окончательного закрытия '>' - необходимо извлечь.

После многочисленных попыток и много отладки - я пришел к выводу, что это неправильный способ сделать это. Я считаю, что я должен обернуть эту часть ответа в CDATA и извлечь ее как .text() на то, что когда-либо было объектом ... в настоящее время мы используем jquery ... ответ возвращается на вызов AJAX ...

Но возможно это может быть сделано .. В настоящее время мы спотыкаемся о вызове .html() для элемента, который, как его XML, попадает в кучу.

TIA.

:-)

Ниже тип данных приложения структуры ответа на «нас» и «XML» для третьей части. Только (& в том числе) от «... до» - необходимо извлечь и передать как есть (текстовую строку) стороннему методу.

<xml> 
    <someNode> 
    <ourStuff veryUseful="true"/> 
    <thirdPartyStuff a="1" b="2"> 
     <moreStuff/> 
     <evenMoreStuff/> 
    </thirdPartyStuff> 
    </someNode> 


</xml> 

Ниже приведено пробное испытание, в основном иллюстрирующее мое невежество. Поэтому, конечно, console.log должен завершиться неудачей.

В действительности данные возвращаются через вызов $ .ajax(), но этот тест иллюстрирует поведение. Он генерирует «Uncaught TypeError: не может вызвать метод« replace »undefined» - так как там is нет innerHtml на узле XML, который, конечно, я считаю абсолютно правильным и документирован как таковой в документах jQuery API ,

Примечание - это не работает для меня в Chrome & IE на Windows, но работает на Firefox (Mac OS) ...: - |

<html> 

<head> 
    <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script> 

    <script type="text/javascript"> 

     function hackit() { 
      var data = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" + 
        "<xml>" + 
        "<thirdParty>" + 
        "<blah a=\"0\" b=\"0\">" + 
        "</blah>" + 
        "</thirdParty>" + 
        "</xml>"; 

      $xmlData = $.parseXML(data); 
      $data = $($xmlData); 
      var thing = $data.find("thirdParty"); 

      console.log(thing.html()); 

     } 
    </script> 
</head> 
<body onload="hackit()"> 

Loaded. 

</body> 
</html> 

Я думаю, что в конечном итоге пойдет этот маршрут.

https://stackoverflow.com/a/14197860/366073

+0

Java!= Javascript :) –

+0

Что еще более важно, XML! = HTML. Было бы целесообразно использовать JS для проверки XML для необходимой информации и отображения этого, но я не знаю, что вы ожидаете от этого, вызвав .html(). Может быть, вы могли бы уточнить, что вы делаете на этом этапе? Как HTML вступает в это? – Katana314

+2

Это не так, он хочет получить строчную форму содержимого someNode, чтобы ее можно было отправить. самый близкий метод к тому, что в jQuery, конечно, есть .html, поэтому он попытался это сделать. –

ответ

0

Ответ здесь работает для меня. https://stackoverflow.com/a/13193743/366073

(Смотри также: https://stackoverflow.com/a/43468/366073) я буду тратить некоторое время на изучение, почему это работает, но предположим, мы итерация узлы, а затем просто сериализации их.

Подводя итог, проблема заключалась не в «извлечении» узла, это был подход к получению строкового представления выбора, а сериализации его - это было неправильно.

Протестировано с использованием фрагмента ниже в IE, FF & Хром и ожидаемые результаты. Обобщаем это в нашем приложении. Пошли с подходом ниже & сейчас работает в нашем приложении ...

<html> 

<head> 
    <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script> 

    <script type="text/javascript"> 

     function serializeXmlNode(xmlNode) { 
      if (typeof window.XMLSerializer != "undefined") { 
       return new window.XMLSerializer().serializeToString(xmlNode); 
      } else if (typeof xmlNode.xml != "undefined") { 
       return xmlNode.xml; 
      } 
      return ""; 
     } 


      function hackit() { 

     var data = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" + 
       "<xml>" + 
       "<ourStuff>" + 
       "<blah a=\"x\" b=\"y\">" + 
       "</blah>" + 
       "</ourStuff>" + 
       "<thirdParty>" + 
       "<blah a=\"0\" b=\"0\">" + 
       "</blah>" + 
       "</thirdParty>" + 
       "</xml>"; 

     var xmlData = $.parseXML(data); 

     var thirdPartyNode = $(xmlData).find("thirdParty blah")[0]; 
     console.log(serializeXmlNode(thirdPartyNode)); 

     var ourNode = $(xmlData).find("ourStuff blah")[0]; 
     console.log(serializeXmlNode(ourNode)); 

    } 
    </script> 
</head> 
<body onload="hackit()"> 

Loaded. 

</body> 
</html> 
Смежные вопросы