Прежде всего - setTimeout и setInterval - это то, что должно использоваться, из-за обратного вызова javascript. Если вы хотите использовать sleep()
, это неправильный поток управления или архитектура вашего кода.
Сказав, что, я полагаю, я все еще могу помочь с двумя реализациями сна.
//a module to do taht //dual-license: MIT or WTF [you can use it anyhow and leave my nickname in a comment if you want to]
var _=(function(){
var queue=[];
var play=function(){
var go=queue.shift();
if(go){if(go.a){go.f();play();}else{setTimeout(play,go.t);}}
}
return {
go:function(f){
queue.push({a:1,f:f});
},
sleep:function(t){
queue.push({a:0,t:t});
},
playback:play
}
})();
[сделать автоматическое воспроизведение также возможно] //usage
_.go(function(){
//your code
console.log('first');
});
_.sleep(5000);
_.go(function(){
//your code
console.log('next');
});
//this triggers the simulation
_.playback();
Я много думал об этом однажды, и единственная идея, которую я имел для истинного сна в javascript, является технической.
функция сна должна быть синхронным вызовом AJAX с тайм-аутом, установленным для сна стоимость. Это все и единственный способ иметь реальный sleep()
Я бы использовал LINQ to XML , если вы в .NET 3.5 или выше.
Вы можете проанализировать XML, используя эту библиотеку System.Xml.Linq
. Ниже приведен пример кода, который я использовал для анализа XML-файла
public CatSubCatList GenerateCategoryListFromProductFeedXML()
{
string path = System.Web.HttpContext.Current.Server.MapPath(_xmlFilePath);
XDocument xDoc = XDocument.Load(path);
XElement xElement = XElement.Parse(xDoc.ToString());
List<Category> lstCategory = xElement.Elements("Product").Select(d => new Category
{
Code = Convert.ToString(d.Element("CategoryCode").Value),
CategoryPath = d.Element("CategoryPath").Value,
Name = GetCateOrSubCategory(d.Element("CategoryPath").Value, 0), // Category
SubCategoryName = GetCateOrSubCategory(d.Element("CategoryPath").Value, 1) // Sub Category
}).GroupBy(x => new { x.Code, x.SubCategoryName }).Select(x => x.First()).ToList();
CatSubCatList catSubCatList = GetFinalCategoryListFromXML(lstCategory);
return catSubCatList;
}
Если вы обрабатываете большой объем данных (много мегабайт), вы хотите использовать XmlReader
для потоковой обработки XML-файла.
Что-нибудь еще (XPathNavigator
, XElement
, XmlDocument
и даже XmlSerializer
, если вы сохраняете полный график объектов) приведет к использованию большой памяти , а также к очень медленному времени загрузки.
Конечно, если вы все равно нужны все данные в памяти, тогда у вас может не быть выбора.
Используйте хорошую схему XSD , чтобы создать набор классов с xsd.exe и использовать XmlSerializer
для создания дерева объектов из вашего XML и наоборот. Если у вас мало ограничений на вашу модель, вы даже можете попытаться создать прямое сопоставление между вашими классами моделей и XML с помощью атрибутов Xml *.
Существует вводная статья о XML-сериализации в MSDN.
Совет по производительности: Построение XmlSerializer
является дорогостоящим. Сохраните ссылку на свой экземпляр XmlSerializer
, если вы собираетесь анализировать / записывать несколько файлов XML.
В дополнение вы можете использовать селектор XPath следующим образом (простой способ выбора определенных узлов):
XmlDocument doc = new XmlDocument();
doc.Load("test.xml");
var found = doc.DocumentElement.SelectNodes("//book[@title='Barry Poter']"); // select all Book elements in whole dom, with attribute title with value 'Barry Poter'
// Retrieve your data here or change XML here:
foreach (XmlNode book in nodeList)
{
book.InnerText="The story began as it was...";
}
Console.WriteLine("Display XML:");
doc.Save(Console.Out);
Мне недавно потребовалось работать над приложением, которое включало анализ XML-документа, и я согласен с Джоном Галлоуэем в том, что подход на основе LINQ to XML, на мой взгляд, лучший. Мне все же пришлось немного подражать, чтобы найти полезные примеры, поэтому без лишних слов, вот несколько!
Любые комментарии приветствуются, поскольку этот код работает, но может быть не идеальным, и я хотел бы узнать больше о синтаксический анализ XML для этого проекта!
public void ParseXML(string filePath)
{
// create document instance using XML file path
XDocument doc = XDocument.Load(filePath);
// get the namespace to that within of the XML (xmlns="...")
XElement root = doc.Root;
XNamespace ns = root.GetDefaultNamespace();
// obtain a list of elements with specific tag
IEnumerable<XElement> elements = from c in doc.Descendants(ns + "exampleTagName") select c;
// obtain a single element with specific tag (first instance), useful if only expecting one instance of the tag in the target doc
XElement element = (from c in doc.Descendants(ns + "exampleTagName" select c).First();
// obtain an element from within an element, same as from doc
XElement embeddedElement = (from c in element.Descendants(ns + "exampleEmbeddedTagName" select c).First();
// obtain an attribute from an element
XAttribute attribute = element.Attribute("exampleAttributeName");
}
С помощью этих функций я смог разобрать любой элемент и любой атрибут из файла XML без проблем!
Вы можете использовать XmlDocument и для управления или извлечения данных из атрибутов, которые вы можете использовать для классов Linq для XML.
Вы можете использовать ExtendedXmlSerializer для сериализации и десериализации.
Instalation Вы можете установить ExtendedXmlSerializer из nuget или выполнить следующую команду:
Install-Package ExtendedXmlSerializer
Сериализация:
ExtendedXmlSerializer serializer = new ExtendedXmlSerializer();
var obj = new Message();
var xml = serializer.Serialize(obj);
Deserialization
var obj2 = serializer.Deserialize<Message>(xml);
Стандартный XML-сериализатор в .NET очень ограничен.
ExtendedXmlSerializer может это сделать и многое другое.
ExtendedXmlSerializer поддерживает .NET 4.5 или выше и .NET Core. Вы можете интегрировать его с WebApi и AspCore.
Если вы используете .NET 2.0, попробуйте XmlReader
и его подклассы XmlTextReader
и XmlValidatingReader
. Они обеспечивают быструю, легкую (использование памяти и т. Д.), Прямой способ анализа XML-файла.
Если вам нужны возможности XPath
, попробуйте XPathNavigator
. Если вам нужен весь документ в памяти, попробуйте XmlDocument
.