Вы можете выполнить запрос селектора по краям, у которых есть свойство source и target
Обратите внимание, что в этом фрагменте нет console.log () по причине:
Коллекция Cytoscape возвращает довольно большой массив информации, поэтому консоль stackoverflow не способна показать это, она пытается показать ее в виде отформатированной строки или чего-то еще и затем останавливается на огромном количестве строк, которые она должна обработать. ...
blockquote>
var cy = window.cy = cytoscape({ container: document.getElementById('cy'), boxSelectionEnabled: false, autounselectify: true, style: [{ selector: 'node', css: { 'content': 'data(id)', 'text-valign': 'center', 'text-halign': 'center', 'height': '60px', 'width': '60px', 'border-color': 'black', 'border-opacity': '1', 'border-width': '10px' } }, { selector: 'edge', css: { 'target-arrow-shape': 'triangle' } } ], elements: { nodes: [{ data: { id: 'a' } }, { data: { id: 'b' } }, { data: { id: 'c' } } ], edges: [{ data: { source: 'a', target: 'b' } }, { data: { source: 'a', target: 'c' } } ] }, layout: { name: 'concentric' } }); // First option: getting the edges with the sourceId "a" and then all targtes of these edges var targets = cy.edges('[source = "a"]').targets(); // Second option: getting the node with the id "#a" and then this nodes outgoers (all outgoing edges and their target node). After that, you can either get all edges with .edges() or all nodes with .nodes() var alternative = cy.$('#a').outgoers().nodes();
body { font: 14px helvetica neue, helvetica, arial, sans-serif; } #cy { height: 100%; width: 75%; position: absolute; left: 0; top: 0; float: left; }
<html> <head> <meta charset=utf-8 /> <meta name="viewport" content="user-scalable=no, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, minimal-ui"> <script src="https://cdnjs.cloudflare.com/ajax/libs/cytoscape/3.2.17/cytoscape.min.js"></script> <script src="https://unpkg.com/jquery@3.3.1/dist/jquery.js"></script> </head> <body> <div id="cy"></div> </body> </html>
Я ожидал бы это XmlReader
с while(reader.Read)() {}
был бы самый быстрый управляемый подход. Конечно, не должны требоваться секунд для чтения 40 КБ..., каков входной подход, который Вы используете?
У Вас, возможно, есть некоторые внешними (схема и т.д.) объекты для разрешения? Если так, Вы смогли писать пользовательское XmlResolver
(набор через XmlReaderSettings
) это использует локально кэшируемые схемы, а не удаленную выборку...
Следующее делает ~300KB фактически немедленно:
using(MemoryStream ms = new MemoryStream()) {
XmlWriterSettings settings = new XmlWriterSettings();
settings.CloseOutput = false;
using (XmlWriter writer = XmlWriter.Create(ms, settings))
{
writer.WriteStartElement("xml");
for (int i = 0; i < 15000; i++)
{
writer.WriteElementString("value", i.ToString());
}
writer.WriteEndElement();
}
Console.WriteLine(ms.Length + " bytes");
ms.Position = 0;
int nodes = 0;
Stopwatch watch = Stopwatch.StartNew();
using (XmlReader reader = XmlReader.Create(ms))
{
while (reader.Read()) { nodes++; }
}
watch.Stop();
Console.WriteLine("{0} nodes in {1}ms", nodes,
watch.ElapsedMilliseconds);
}
Создайте XmlReader
объект путем передачи в XmlReaderSettings
объект, который имеет ConformanceLevel.Document
.
Это проверит отмеченность.
Эта статья MSDN должна объяснить детали.
На моем довольно обычном ноутбуке, читая 250K XML-документ от начала до конца с XmlReader
берет 6 миллисекунд. Что-то еще помимо просто парсинга XML является преступником.
Лично, я довольно ленив..., таким образом, я ищу библиотеки.NET, которые уже решают проблему. Попытайтесь использовать DataSet.ReadXML()
функционируйте и поймайте исключения. Это делает довольно удивительное задание объяснения ошибок формата XML.
Как другие упомянули, узкое место наиболее вероятно не XmlReader.
Проверьте, сделали ли бы Вы, оказалось, не большую конкатенацию строк без stringbuilder.
Это может действительно уничтожить Вашу производительность.