matplotlib.cbook.flatten()
будет работать для вложенных списков, даже если они гнездятся более глубоко, чем пример.
import matplotlib
l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
print(list(matplotlib.cbook.flatten(l)))
l2 = [[1, 2, 3], [4, 5, 6], [7], [8, [9, 10, [11, 12, [13]]]]]
print list(matplotlib.cbook.flatten(l2))
Результат:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
Это на 18 раз быстрее, чем подчеркивание. _.flatten:
Average time over 1000 trials of matplotlib.cbook.flatten: 2.55e-05 sec
Average time over 1000 trials of underscore._.flatten: 4.63e-04 sec
(time for underscore._)/(time for matplotlib.cbook) = 18.1233394636
Я получил его.
Оказывается, что для выхода из двоеточия требуется \\
.
$.get(xmlPath, {}, function(xml) {
$("rs\\:data", xml).find("z\\:row").each(function(i) {
alert("found zrow");
});
}, "xml");
Как сказал Rich:
лучшее решение не требует экранирования и работает на всех «современных» браузерах:
.find("[nodeName=z:row]")
В качестве альтернативы вы можете использовать fast-xml-parser в вашем проекте и преобразовать данные XML в объект JS / JSON. Тогда вы можете использовать его как свойство объекта. Он не использует JQuery или другие библиотеки, но он решит вашу цель.
var xmlData = '<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">'
+' <s:Schema id="RowsetSchema">'
+' <s:ElementType name="row" content="eltOnly" rs:CommandTimeout="30">'
+' <s:AttributeType name="ows_ID" rs:name="ID" rs:number="1">'
+' <s:datatype dt:type="i4" dt:maxLength="4" />'
+' </s:AttributeType>'
+' <s:AttributeType name="ows_DocIcon" rs:name="Type" rs:number="2">'
+' <s:datatype dt:type="string" dt:maxLength="512" />'
+' </s:AttributeType>'
+' <s:AttributeType name="ows_LinkTitle" rs:name="Title" rs:number="3">'
+' <s:datatype dt:type="string" dt:maxLength="512" />'
+' </s:AttributeType>'
+' <s:AttributeType name="ows_ServiceCategory" rs:name="Service Category" rs:number="4">'
+' <s:datatype dt:type="string" dt:maxLength="512" />'
+' </s:AttributeType>'
+' </s:ElementType>'
+' </s:Schema>'
+' <rs:data>'
+' <z:row ows_ID="2" ows_LinkTitle="Sample Data 1" />'
+' <z:row ows_ID="3" ows_LinkTitle="Sample Data 2" />'
+' <z:row ows_ID="4" ows_LinkTitle="Sample Data 3" />'
+' </rs:data>'
+'</xml>'
var jsObj = parser.parse(xmlData,{attrPrefix:"",ignoreTextNodeAttr: false});
document.write(JSON.stringify(jsObj.xml["rs:data"]["z:row"][0],null,4) + "<br>");
document.write(JSON.stringify(jsObj.xml["rs:data"]["z:row"][1],null,4) + "<br>");
document.write(JSON.stringify(jsObj.xml["rs:data"]["z:row"][2],null,4) + "<br>");
<script src="https://cdnjs.cloudflare.com/ajax/libs/fast-xml-parser/2.9.2/parser.min.js"></script>
Вы можете игнорировать пространства имен во время разбора к объекту js / json. В этом случае вы можете получить прямой доступ как jsObj.xml.data.row
.
for(var i=0; i< jsObj.xml.data.row.length; i++){
console.log(jsObj.xml.data.row[i]);
}
Отказ от ответственности: я создал fast-xml-parser.
Стоит отметить, что с jQuery 1.7 были проблемы с некоторыми общими задачами для поиска элементов с именами. См. Эти ссылки для получения дополнительной информации:
: $this.find("content\\:encoded, encoded").text()
- идеальное решение ...
Как упоминалось выше, есть проблемы с вышеупомянутым решением с текущими браузерами / версиями jQuery - предлагаемый подключаемый модуль не полностью работает либо из-за проблем с случаем (nodeName
, как свойство, иногда во всех случаях верхний регистр). Итак, я написал следующую быструю функцию:
$.findNS = function (o, nodeName)
{
return o.children().filter(function ()
{
if (this.nodeName)
return this.nodeName.toUpperCase() == nodeName.toUpperCase();
else
return false;
});
};
Пример использования:
$.findNS($(xml), 'x:row');
Хотя приведенный выше ответ кажется правильным, он не работает в браузерах webkit (Safari, Chrome). Лучшее решение, которое я считаю, будет:
.find("[nodeName=z:myRow, myRow]")
Я не видел никакой документации по использованию JQuery для синтаксического анализа XML. JQuery обычно использует Browser dom для просмотра HTML-документа, я не верю, что он читает сам html.
Вероятно, вам стоит взглянуть на встроенную обработку XML в самом JavaScript.
http://www.webreference.com/programming/javascript/definitive2/
Исходный ответ: jQuery XML-анализ, как получить атрибут элемента
Вот пример того, как успешно получить значение в Chrome ..
item.description = jQuery(this).find("[nodeName=itunes\\:summary]").eq(0).text();
Если кому-то нужно это сделать без jQuery, просто с обычным Javascript и для Google Chrome (webkit), это единственный способ заставить его работать после многих исследований и тестирования.
blockquote>
parentNode.getElementsByTagNameNS("*", "name");
Это будет работать для извлечения следующего узла:
<prefix:name>
. Как вы видите, префикс или пространство имен опущено, и оно будет соответствовать элементам с разными пространствами имен, если имя тегаname
. Но, надеюсь, это не будет проблемой для вас.Ничего из этого не сработало для меня (я разрабатываю расширение Google Chrome):
getElementsByTagNameNS("prefix", "name")
getElementsByTagName("prefix:name")
getElementsByTagName("prefix\\:name")
getElementsByTagName("name")
Правка : после некоторого сна я нашел рабочее обходное решение :) Эта функция возвращает первый узел, соответствующий полному
nodeName
, например<prefix:name>
:// Helper function for nodes names that include a prefix and a colon, such as "<yt:rating>" function getElementByNodeName(parentNode, nodeName) { var colonIndex = nodeName.indexOf(":"); var tag = nodeName.substr(colonIndex + 1); var nodes = parentNode.getElementsByTagNameNS("*", tag); for (var i = 0; i < nodes.length; i++) { if (nodes[i].nodeName == nodeName) return nodes[i] } return undefined; }
Его можно легко изменить, если вам нужно вернуть все соответствующие элементы. Надеюсь, это поможет!
Для jQuery для работы с пространствами имен в селекторах есть плагин jquery-xmlns .
Для браузеров Webkit вы можете просто оставить двоеточие. Итак, чтобы найти <media:content>
в RSS-канале, например, вы можете сделать это:
$(this).find("content");
Я потратил несколько часов на это чтение о плагинах и всех видах решений без везения.
ArnisAndy разместил ссылку на обсуждение jQuery, где этот ответ предлагается, и я могу подтвердить, что это работает для меня в Chrome (v18.0), FireFox (v11.0), IE (v9.08) и Safari (v5.1.5) с использованием jQuery (v1.7.2).
Я пытаюсь очистить канал WordPress, где содержимое называется & lt; content: encoded & gt; и это то, что сработало для меня:
content: $this.find("content\\:encoded, encoded").text()
«\\» экранирование не является надежным, и простой
.find('[nodeName="z:row"]')
метод, кажется, был сломан как JQuery 1.7. Я смог найти решение для 1.7, используя функцию фильтра, здесь: Улучшение производительности XML-узла JavaScript Javascript
просто заменил пространство имен пустой строкой. Прекрасно работает для меня. Тестируемое решение в браузерах: Firefox, IE, Chrome
. Моя задача состояла в том, чтобы читать и анализировать EXCEL-файл через API-интерфейс Sharepoint EXCEL REST. XML-ответ содержит теги с пространством имен «x:».
Я решил заменить пространство имен в XML пустой строкой. Работает следующим образом: 1. Получите узел интереса из XML-ответа 2. Преобразуйте выбранный узел XML-Response (Document) в String 2. Замените пространство имен пустой строкой 3. Преобразуйте строку обратно в XML-документ
См. схему кода здесь ->
function processXMLResponse)(xData)
{
var xml = TOOLS.convertXMLToString("", "",$(xData).find("entry content")[0]);
xml = xml.replace(/x:/g, ""); // replace all occurences of namespace
xData = TOOLS.createXMLDocument(xml); // convert string back to XML
}
Для преобразования XML-to-String найдите решение здесь: http://www.sencha.com/forum/showthread. PHP? 34553-Convert-DOM-XML-документа в строку
Если вы используете jquery 1.5, вам нужно будет добавить кавычки вокруг значения атрибута селектора узлов, чтобы заставить его работать:
.find('[nodeName="z:row"]')
На начало 2016 года для меня следующий синтаксис работает с jQuery 1.12.0:
.find("z\\:row")
.find("z\\:row")
.find("row")
Синтаксис .find("[nodeName=z:row]")
не работает в любом из упомянутых выше браузеров. Я не нашел способа применить пространство имен в Chrome.
Объединяя все это, во всех упомянутых выше браузерах работает следующий синтаксис: .find("row,z\\:row")
Мое решение (потому что я использую прокси-сервер Php) заключается в замене: namespace на _ ... поэтому больше нет пространства имен; -)
Держите его простым!
jQuery 1.7 не работает со следующим:
$(xml).find("[nodeName=a:IndexField2]")
Одним из решений, которое я получил для работы в Chrome, Firefox и IE, является использование селекторов, которые работают в IE и селекторах, которые работают в Chrome, основанный на том, что один из способов работает в IE, а другой в Chrome:
$(xml).find('a\\\\:IndexField2, IndexField2')
В IE это возвращает узлы с использованием пространства имен (Firefox и IE требуют пространства имен), а в Chrome , селектор возвращает узлы на основе селектора без имен. Я не тестировал это в Safari, но он должен работать, потому что он работает в Chrome.
Ни одно из вышеперечисленных решений не работает так хорошо. Я нашел это и был улучшен для скорости. просто добавьте это, работая как шарм:
$.fn.filterNode = function(name) {
return this.find('*').filter(function() {
return this.nodeName === name;
});
};
использование:
var ineedthatelementwiththepsuedo = $('someparentelement').filterNode('dc:creator');
Найденное решение в комментарии: Анализ XML с пространствами имен с использованием jQuery $ (). find
Использование второй половины имени узла после того, как двоеточие работало для меня , Использовал .find («lat») вместо .find («geo \: lat»), и он работал для меня.
blockquote>
Моя настройка:
- Chrome 42
- jQuery 2.1.3
Пример XML (фрагмент из API контактов Google):
<entry> <id>http://www.google.com/m8/feeds/contacts/mstefanow%40gmail.com/base/0</id> <gd:email rel="http://schemas.google.com/g/2005#other" address="email@example.com" primary="true"/> </entry>
Анализ кода:
var xmlDoc = $.parseXML( xml ); var $xml = $( xmlDoc ); var $emailNode = $xml.find( "email" ); $("#email").html($emailNode.attr("address"));
Plnkr: http://plnkr.co/edit/l8VzyDq1NHtn5qC9zTjf?p=preview