Parse (.Plist) в visual Studio 2017 Использование C # [дубликат]

Решением этого является использование отражения с помощью DataContractSerializer. Вам даже не нужно отмечать свой класс [DataContract] или [DataMember]. Он будет сериализовать любой объект, независимо от того, имеет ли он свойства типа интерфейса (включая словари) в xml. Вот простой метод расширения, который будет сериализовать любой объект в XML, даже если он имеет интерфейсы (обратите внимание, что вы можете настроить его так же, как и рекурсивно).

  public static XElement ToXML (этот объект o)  {Введите t = o.GetType ();  Тип [] extraTypes = t.GetProperties () .Where (p = & gt; p.PropertyType.IsInterface) .Выберите (p = & gt; p.GetValue (o, null) .GetType ()) .ToArray ();  DataContractSerializer serializer = новый DataContractSerializer (t, extraTypes);  StringWriter sw = new StringWriter ();  XmlTextWriter xw = новый XmlTextWriter (sw);  serializer.WriteObject (xw, o);  return XElement.Parse (sw.ToString ());  }  

, что делает выражение LINQ, перечисляет каждое свойство, возвращает каждое свойство, являющееся интерфейсом, получает значение этого свойства (базового объекта), получает тип этого конкретного объекта помещает его в массив и добавляет это в список известных типов сериализатора.

Теперь сериализатор знает, как о типах, которые он сериализует, чтобы он мог выполнять свою работу.

262
задан GEOCHET 20 March 2009 в 00:03
поделиться

10 ответов

Есть много способов, некоторые:

  • XmlSerializer. используйте класс с целевой схемой, которую вы хотите прочитать, - используйте XmlSerializer для получения данных в Xml, загруженных в экземпляр класса.
  • Linq 2 xml
  • XmlTextReader.
  • XmlDocument
  • XPathDocument (доступ только для чтения)
9
ответ дан Dirk Vollmar 16 August 2018 в 12:07
поделиться
  • 1
    На самом деле, XmlReader.Create вместо использования XmlTextReader напрямую, начиная с .NET 2.0. – John Saunders 13 March 2009 в 13:05

Вот приложение, которое я написал для чтения xml sitemaps:

  using System;  используя System.Collections.Generic;  используя System.Windows.Forms;  используя System.Linq;  используя System.Text;  используя System.Threading.Tasks;  используя System.IO;  используя System.Data;  используя System.Xml;  namespace SiteMapReader {class Program {static void Main (string [] args) {Console.WriteLine ("Пожалуйста, введите местоположение файла");  // получить местоположение, которое мы хотим получить в файлах Sitemap из строки dirLoc = Console.ReadLine ();  // получить все строки sitemaps [] sitemaps = Directory.GetFiles (dirLoc);  StreamWriter sw = новый StreamWriter (Application.StartupPath + @ "\ locs.txt", true);  // зацикливаем каждый файл foreach (строка sitemap в файлах Sitemap) {try {// новый экземпляр xdoc XmlDocument xDoc = новый XmlDocument ();  // загружаем xml из местоположения xDoc.Load (sitemap);  // цикл через каждый дочерний noed foreach (узел XmlNode в xDoc.DocumentElement.ChildNodes) {// первым узлом является url ... нужно перейти к следующему узлу loce foreach (XmlNode locNode в узле) {// имеется пару дочерних элементов  узлы здесь, поэтому берут данные только из узла с именем loc if (locNode.Name == "loc") {// получают содержимое строки loc loc loc = locNode.InnerText;  // пишем его на консоль, чтобы вы могли видеть ее рабочую консоль.WriteLine (loc + Environment.NewLine);  // записываем его в файл sw.Write (loc + Environment.NewLine);  }}}} catch {}} Console.WriteLine ("All Done :-)");  Console.ReadLine ();  } static void readSitemap () {}}}  

Код на вставке http://pastebin.com/yK7cSNeY

13
ответ дан Grant Winney 16 August 2018 в 12:07
поделиться

Вы можете:

Примеры приведены на страницах msdn, предоставленных

4
ответ дан Grzenio 16 August 2018 в 12:07
поделиться

LINQ to XML Пример:

  // Загружая из файла, вы также можете загрузить из потока var xml = XDocument.Load (@ "C:  \ contacts.xml ");  // Запросить данные и выписать подмножество контактов var query = from c в xml.Root.Descendants ("contact") где (int) c.Attribute ("id") & lt;  4 выберите c.Element ("firstName"). Значение + "" + c.Element ("lastName").  foreach (имя строки в запросе) {Console.WriteLine («Полное имя контакта: {0}», имя);  }  

Ссылка: LINQ to XML в MSDN

163
ответ дан Konstantin Tarkus 16 August 2018 в 12:07
поделиться
  • 1
    XDocument.Parse (& Quot; & Lt; & XML-GT, что-то & Lt; / XML & GT; & Quot;); для строки. – Wolf5 22 April 2015 в 13:28
  • 2
    Здравствуй. Я хочу загрузить XML-документ, расположенный в корневом каталоге моего веб-сайта. Но я получаю сообщение о том, что сетевые пути не поддерживаются – It's a trap 5 January 2017 в 14:17

Существуют разные способы, в зависимости от того, где вы хотите получить. XmlDocument легче XDocument, но если вы хотите минимально проверить, что строка содержит XML, то регулярное выражение, возможно, является самым быстрым и легким выбором, который вы можете сделать. Например, я применил Smoke Tests с SpecFlow для моего API, и я хочу проверить, есть ли какой-либо из результатов в любом действительном XML - тогда я бы использовал регулярное выражение. Но если мне нужно извлечь значения из этого XML, я бы проанализировал его с помощью XDocument, чтобы сделать это быстрее и с меньшим количеством кода. Или я бы использовал XmlDocument, если мне нужно работать с большим XML (а иногда я работаю с XML, которые вокруг 1M строк, даже больше); то я мог бы даже читать его по строкам. Зачем? Попробуйте открыть более 800 МБ в частных байтах в Visual Studio; даже при производстве у вас не должно быть объектов размером более 2 ГБ. Вы можете с помощью twerk, но не должны. Если вам придется разбирать документ, содержащий много строк, то эти документы, вероятно, будут CSV.

Я написал этот комментарий, потому что я вижу множество примеров с XDocument. XDocument не подходит для больших документов или когда вы хотите проверить, действительно ли контент является XML. Если вы хотите проверить, имеет ли смысл сам XML, то вам нужна схема.

Я также отклонил предложенный ответ, потому что считаю, что ему нужна вышеуказанная информация внутри себя. Представьте, что мне нужно проверить, является ли 200M XML, 10 раз в час, действительным XML. XDocument будет тратить много ресурсов.

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

0
ответ дан Nikola 16 August 2018 в 12:07
поделиться

Вы можете использовать DataSet для чтения XML-строк.

  var xmlString = File.ReadAllText (FILE_PATH);  var stringReader = new StringReader (xmlString);  var dsSet = новый DataSet ();  dsSet.ReadXml (StringReader);   

Проводя это ради информации.

3
ответ дан prasanna venkatesh 16 August 2018 в 12:07
поделиться
  • 1
    очень хорошо! это самый быстрый способ найти информацию из столбцов sql xml и .net !! – elle0087 18 January 2018 в 15:30

Например, посмотрите класс XmlTextReader .

2
ответ дан Quintin Balsdon 16 August 2018 в 12:07
поделиться
  public void ReadXmlFile () {string path = HttpContext.Current.Server.MapPath ("~ / App_Data");  // Находит местоположение App_Data на сервере.  XmlTextReader reader = новый XmlTextReader (System.IO.Path.Combine (путь, XMLFile7.xml));  // Объединяет расположение App_Data и имя файла while (reader.Read ()) {switch (reader.NodeType) {case XmlNodeType.Element: break;  case XmlNodeType.Text: columnNames.Add (reader.Value);  ломать;  case XmlNodeType.EndElement: break;  }}}  

Вы можете избежать первого оператора и просто указать имя пути в конструкторе XmlTextReader.

0
ответ дан Vishal Kotak 16 August 2018 в 12:07
поделиться

Linq to XML.

Кроме того, VB.NET имеет гораздо лучшую поддержку синтаксического анализа xml через компилятор, чем C #. Если у вас есть опция и желание, проверьте это.

6
ответ дан Will 16 August 2018 в 12:07
поделиться
  • 1
    msgstr "Все неправильно"? Не точный, я должен думать, если это утверждение не было в шутке. ОП не предоставил информации. о версии .NET, над которой он работает. – Cerebrus 13 March 2009 в 13:02
  • 2
    После редактирования : Большая усмешка! ;-) – Cerebrus 13 March 2009 в 13:21
  • 3
    Хе-хе, да. Это было в шутку, но я не смешной, поэтому я удалил его. – Will 15 March 2009 в 17:48

XmlDocument для чтения XML из строки или из файла.

  XmlDocument doc = new XmlDocument ();  doc.Load ( "C: \\ temp.xml");   

или

  doc.LoadXml ("& lt; xml & gt; something & lt; / xml & gt;");   

, затем найдите узел под ним, например:

  XmlNode node = doc.DocumentElement.SelectSingleNode ("/ book / title");   

или

  foreach (узел XmlNode в doc.DocumentElement.ChildNodes) {строка text = node.InnerText;  // или зацикливаем на его дочерние элементы}  

, затем читаем текст внутри этого узла, как это

  string text = node.InnerText;   

или прочитать атрибут

  string attr = node.Attributes ["theattributename"] ?. InnerText  

Всегда проверяйте значение null на атрибутах ["something"], поскольку оно будет null, если атрибут не существует.

361
ответ дан Wolf5 16 August 2018 в 12:07
поделиться
  • 1
    Действительно, но Linq to XML намного приятнее. – Finglas 21 January 2010 в 17:27
  • 2
    Хотя вы говорите, что «лучше», есть ли другие недостатки, чтобы делать это таким образом над LINQ? Лично я нашел этот метод самым простым, по крайней мере, для моих нужд. – Kolors 22 January 2013 в 21:34
  • 3
    Я написал это до того, как начал использовать LINQ. LINQ хорош и может иметь более легкую читаемость. В основном я использую LINQ в эти дни. Но некоторым компонентам нужны старые XML-объекты стиля, поэтому он все равно используется и сейчас. Я бы рекомендовал попробовать «старый стиль». здесь и LINQ и посмотрите, что вам подходит. – Wolf5 23 January 2013 в 11:36
  • 4
    Не должен ли узел XmlNode = XmlDocument.Docu ... действительно быть XmlNode = doc.Docu ... ? Почему был изменен ответ, а документ удален? – wasatchwizard 3 November 2014 в 20:57
  • 5
    Правда. Я понятия не имею, почему я изменил это ... Исправит. – Wolf5 4 November 2014 в 13:29
Другие вопросы по тегам:

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