Отклик XML-ответа на WebService на соответствующий тип c # [duplicate]

Прежде всего - setTimeout и setInterval - это то, что должно использоваться, из-за обратного вызова javascript. Если вы хотите использовать sleep(), это неправильный поток управления или архитектура вашего кода.

Сказав, что, я полагаю, я все еще могу помочь с двумя реализациями сна.

  1. faking синхронный запуск с верхней части моей головы:
    //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();
    
  2. реальный синхронный запуск

Я много думал об этом однажды, и единственная идея, которую я имел для истинного сна в javascript, является технической.

функция сна должна быть синхронным вызовом AJAX с тайм-аутом, установленным для сна стоимость. Это все и единственный способ иметь реальный sleep()

492
задан John Saunders 21 June 2015 в 04:22
поделиться

9 ответов

Я бы использовал LINQ to XML , если вы в .NET 3.5 или выше.

227
ответ дан Joey 24 August 2018 в 07:26
поделиться

Вы можете проанализировать 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;
}
2
ответ дан Brad Larson 24 August 2018 в 07:26
поделиться

Если вы обрабатываете большой объем данных (много мегабайт), вы хотите использовать XmlReader для потоковой обработки XML-файла.

Что-нибудь еще (XPathNavigator, XElement, XmlDocument и даже XmlSerializer, если вы сохраняете полный график объектов) приведет к использованию большой памяти , а также к очень медленному времени загрузки.

Конечно, если вы все равно нужны все данные в памяти, тогда у вас может не быть выбора.

22
ответ дан Community 24 August 2018 в 07:26
поделиться

Используйте хорошую схему XSD , чтобы создать набор классов с xsd.exe и использовать XmlSerializer для создания дерева объектов из вашего XML и наоборот. Если у вас мало ограничений на вашу модель, вы даже можете попытаться создать прямое сопоставление между вашими классами моделей и XML с помощью атрибутов Xml *.

Существует вводная статья о XML-сериализации в MSDN.

Совет по производительности: Построение XmlSerializer является дорогостоящим. Сохраните ссылку на свой экземпляр XmlSerializer, если вы собираетесь анализировать / записывать несколько файлов XML.

44
ответ дан Danny Beckett 24 August 2018 в 07:26
поделиться

В дополнение вы можете использовать селектор 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);

документация

1
ответ дан Joel Harkes 24 August 2018 в 07:26
поделиться

Мне недавно потребовалось работать над приложением, которое включало анализ 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 без проблем!

3
ответ дан PJRobot 24 August 2018 в 07:26
поделиться

Вы можете использовать XmlDocument и для управления или извлечения данных из атрибутов, которые вы можете использовать для классов Linq для XML.

0
ответ дан shaishav shukla 24 August 2018 в 07:26
поделиться

Вы можете использовать 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 очень ограничен.

  • не поддерживает сериализацию класса с круговой ссылкой или классом с свойством интерфейса,
  • Не поддерживает словари,
  • Механизм чтения старой версии XML отсутствует
  • Если вы хотите создать собственный сериализатор, ваш класс должен наследовать от IXmlSerializable. Это означает, что ваш класс не будет классом POCO,
  • Не поддерживает IoC.

ExtendedXmlSerializer может это сделать и многое другое.

ExtendedXmlSerializer поддерживает .NET 4.5 или выше и .NET Core. Вы можете интегрировать его с WebApi и AspCore.

0
ответ дан Wojtpl2 24 August 2018 в 07:26
поделиться

Если вы используете .NET 2.0, попробуйте XmlReader и его подклассы XmlTextReader и XmlValidatingReader. Они обеспечивают быструю, легкую (использование памяти и т. Д.), Прямой способ анализа XML-файла.

Если вам нужны возможности XPath , попробуйте XPathNavigator. Если вам нужен весь документ в памяти, попробуйте XmlDocument.

286
ответ дан Danny Beckett 24 August 2018 в 07:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: