Вот что я сделал:
Я расколол ваш файл данных в более длинный формат, а затем сгруппировал его по столбцу имен. В каждой группе я бросаю NaNs, но затем пересказываю полный набор h1 мысли h4, тем самым воссоздавая ваши NaN справа.
from io import StringIO
import pandas
def defragment(x):
values = x.dropna().values
return pandas.Series(values, index=df.columns[:len(values)])
datastring = StringIO("""\
Name h1 h2 h3 h4
A 1 nan 2 3
B nan nan 1 3
C 1 3 2 nan""")
df = pandas.read_table(datastring, sep='\s+').set_index('Name')
long_index = pandas.MultiIndex.from_product([df.index, df.columns])
print(
df.stack()
.groupby(level='Name')
.apply(defragment)
.reindex(long_index)
.unstack()
)
И вот я получаю:
h1 h2 h3 h4
A 1 2 3 NaN
B 1 3 NaN NaN
C 1 3 2 NaN
Проверьте тип контента ответа. Если Вы получите messages.xml как неправильный тип пантомимы, то Internet Explorer не проанализирует его как XML.
Для проверки типа контента Вам нужен доступ к объекту XMLHttpRequest. Нормальный обратный вызов успеха не передает его в качестве параметра, таким образом, необходимо добавить универсальный ajaxComplete или ajaxSuccess обработчик событий. Второй параметр для тех событий является объектом XMLHttpRequest. Можно назвать getResponseHeader метод на нем для получения типа контента.
$(document).ajaxComplete(function(e, x) {
alert(x.getResponseHeader("Content-Type"));
});
, К сожалению, нет никакого способа, которым я знаю о в Internet Explorer для переопределения то, что сервер отправляет, поэтому если неправильно, что необходимо изменить сервер для отправки "text/xml" за типом контента.
Некоторые браузеры имеют overrideMimeType
метод, который можно назвать прежде send
, чтобы вынудить это использовать "text/xml", но Internet Explorer не поддерживает это насколько я знаю.
Иногда IE читает разрывы строки как дополнительные узлы. Попытайтесь удалить дополнительный пробел до тегов или попытайтесь монтировать в корпус его как CDATA.
Можно найти, что при передаче типа данных в Ваш получать вызов он может проанализировать как XML правильно. Причуды IE могли остановить jQuery, автоматически обнаруживающий его как XML, приводящий к неправильному типу данных, передаваемому функции обратного вызова.
<script type="text/javascript">
$(document).ready(function() {
$.get('messages.xml', function(d) {
//I have confirmed that it gets to here in IE
//and it has the xml loaded.
//alert(d); gives me a message box with the xml text in it
//alert($(d).find('message')); gives me "[object Object]"
//alert($(d).find('message')[0]); gives me "undefined"
//alert($(d).find('message').Length); gives me "undefined"
$(d).find('message').each(function() {
//But it never gets to here in IE
var $msg = $(this);
var type = $msg.attr("type");
var message = $msg.text();
switch (type) {
case "HeaderMessage":
$("#HeaderMessageDiv").html(message);
break;
case "FooterMessage":
$("#footermessagecell").html(message);
break;
default:
}
});
}, "xml");
});
</script>
РЕДАКТИРОВАНИЕ:
я на самом деле только что испытал .find () не работающий на проект ни в каком браузере, но я смог использовать .filter () вместо этого. Это является раздражающим, что я должен был обратиться к этому, но если это работает....
$(d).filter('message').each(......);
Так как проблема IE заключается в том, что его xml парсер давит на xml файлы, которые не передаются с использованием правильного заголовка "text/xml", вы можете включить немного кода в событие Ajax complete:
complete: function( xhr, status ) { alert( "COMPLETE. You got:\n\n" + xhr.responseText ) ; if( status == 'parsererror' ) { alert( "There was a PARSERERROR. Luckily, we know how to fix that.\n\n" + "The complete server response text was " + xhr.responseText ) ; xmlDoc = null; // Create the xml document from the responseText string. // This uses the w3schools method. // see also if( window.DOMParser ) { parser=new DOMParser(); xmlDoc=parser.parseFromString( xhr.responseText,"text/xml" ) ; } else // Internet Explorer { xmlDoc=new ActiveXObject( "Microsoft.XMLDOM" ) ; xmlDoc.async = "false" ; xmlDoc.loadXML( xhr.responseText ) ; } $( '#response' ).append( '<p>complete event/xmlDoc: ' + xmlDoc + '</p>' ) ; $( '#response' ).append( '<p>complete event/status: ' + status + '</p>' ) ; processXMLDoc( xmlDoc ) ; } },
<!DOCTYPE html> <html> <head> <title>Reading XML with jQuery</title> <style> #response { border: solid 1px black; padding: 5px; } </style> <script src="jquery-1.3.2.min.js"></script> <script> function processXMLDoc( xmlDoc ) { var heading = $(xmlDoc).find('heading').text() ; $( '#response' ).append( '<h1>' + heading + '</h1>' ) ; var bodyText = $(xmlDoc).find('body').text() ; $( '#response' ).append( '<p>' + bodyText + '</p>' ) ; } $(document).ready(function() { jQuery.ajax({ type: "GET", url: "a.xml", // ! watch out for same // origin type problems dataType: "xml", // 'xml' passes it through the browser's xml parser success: function( xmlDoc, status ) { // The SUCCESS EVENT means that the xml document // came down from the server AND got parsed successfully // using the browser's own xml parsing caps. processXMLDoc( xmlDoc ); // IE gets very upset when // the mime-type of the document that // gets passed down isn't text/xml. // If you are missing the text/xml header // apparently the xml parse fails, // and in IE you don't get to execute this function AT ALL. }, complete: function( xhr, status ) { alert( "COMPLETE. You got:\n\n" + xhr.responseText ) ; if( status == 'parsererror' ) { alert( "There was a PARSERERROR. Luckily, we know how to fix that.\n\n" + "The complete server response text was " + xhr.responseText ) ; xmlDoc = null; // Create the xml document from the responseText string. // This uses the w3schools method. // see also if( window.DOMParser ) { parser=new DOMParser(); xmlDoc=parser.parseFromString( xhr.responseText,"text/xml" ) ; } else // Internet Explorer { xmlDoc=new ActiveXObject( "Microsoft.XMLDOM" ) ; xmlDoc.async = "false" ; xmlDoc.loadXML( xhr.responseText ) ; } $( '#response' ).append( '<p>complete event/xmlDoc: ' + xmlDoc + '</p>' ) ; $( '#response' ).append( '<p>complete event/status: ' + status + '</p>' ) ; processXMLDoc( xmlDoc ) ; } }, error: function( xhr, status, error ) { alert( 'ERROR: ' + status ) ; alert( xhr.responseText ) ; } }); }); </script> </head> <body> <div> <h1><a href="http://think2loud.com/reading-xml-with-jquery/">Reading XML with jQuery</a></h1> <p> <a href="http://docs.jquery.com/Ajax/jQuery.ajax#options">#1 jQuery.ajax ref</a> </p> </div> <p>Server says:</p> <pre id="response"> </pre> </body> </html>
<?xml version="1.0"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
Оно расширяет этот пример.
Я столкнулся с той же проблемой, когда я получал данные из документа XML. Ведь протягивающуюся в Интернете, я подошел найти этот сайт, но без подходящего ответа на вопрос. Но один ответ помог мне решить проблему, хотя:
«Поскольку проблема IE IE - это его разбивки анализатора XML на XML-файлах, которые не передаются вниз, используя правильный заголовок« Text / XML », вы можете включить немного кода в AJAX Полное событие: «
Я определил две проблемы с IE при создании вызовов $ .ajax (...) и $. (...):
значение XML значение параметра должно Будьте в верхнем регистре («XML» не «XML») для обоих вызовов - $ .ajax (..., datatype: "XML") и $. Get (XmldatafilePath, функция (d) {...} , «XML»)
Когда ajax вызов добивается успеха, аргумент XML функции обратного вызова на самом деле является строкой , а не объект XML DOM
, второй вопрос решается следующим образом:
$(document).ready(function()
{
$.ajax(
{
type: "GET",
url: "messages.xml",
dataType: "XML", /* this parameter MUST BE UPPER CASE for it to work in IE */
success: function(xml)
{
processXmlDoc( createXmlDOMObject ( xml ) );
}, /* success: */
error: function(xhr, textStatus, errorThrown)
{
alert(textStatus + ' ' + errorThrown);
} /* error: */
});/* $.ajax */
function createXmlDOMObject(xmlString)
{
var xmlDoc = null;
if( ! window.DOMParser )
{
// the xml string cannot be directly manipulated by browsers
// such as Internet Explorer because they rely on an external
// DOM parsing framework...
// create and load an XML document object through the DOM
// ActiveXObject that it can deal with
xmlDoc = new ActiveXObject( "Microsoft.XMLDOM" );
xmlDoc.async = false;
xmlDoc.loadXML( xmlString );
}
else
{
// the current browser is capable of creating its own DOM parser
parser = new DOMParser();
xmlDoc = parser.parseFromString( xmlString, "text/xml" ) ;
}
return xmlDoc;
}
function processXmlDoc(xmlDoc)
{
// write here your XML processing logic for the document object...
}
}); // $(document).ready
У меня такая же проблема, я разрабатываю веб-приложение, но мне нужно развернуть его в автономном режиме, на CD. Я нашел решение на этой странице, которое является тем же решением, которое вы можете увидеть выше http://docs.jquery.com/Specifying_the_Data_Type_for_AJAX_Requests и код очень прост:
$.ajax({
url: "data.xml",
dataType: ($.browser.msie) ? "text" : "xml",
success: function(data){
var xml;
if (typeof data == "string") {
xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = false;
xml.loadXML(data);
} else {
xml = data;
}
// write here your XML processing logic for the document object...
}
});
Измените следующее содержимое.
dataType :"text/xml",
-
dataType :"xml",
Нет необходимости изменять find ().
$.ajax({
url: 'messages.xml',
success: function(data){
$(d).find('message').each(function(){
//But it never gets to here in IE
var $msg = $(this);
var type = $msg.attr("type");
var message = $msg.text();
switch (type) {
case "HeaderMessage":
$("#HeaderMessageDiv").html(message);
break;
case "FooterMessage":
$("#footermessagecell").html(message);
break;
}
});
},
dataType: 'xml'
});
Попробуйте сказать jQuery, какой тип данных он получает, чтобы он использовал правильные методы для обработки вашего запроса.
DataType : "xml" не устраняет эту проблему в IE8, а скорее вызывает ошибку "TypeError".
Быстрое и грязное решение, это обернуть xml ответ в html элемент, например div:
$("<div>" + xml + "</div>").find("something");
(работает во всех браузерах)
Вы можете сделать
<a>
<messages>
<message type="HeaderMessage">
This message is put up in the header area.
</message>
<message type="FooterMessage">
This message is put in the lower left cell.
</message>
</messages>
</a>
и использовать find(). Это работает для IE8 и для firefox v.3.6.3
У меня та же проблема...
Решил с помощью этого :
http://www.w3schools.com/dom/dom_parser.asp
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);
}
используйте его для преобразования вашего var в xml объект...