Хотя вы говорите, что это «лучше», есть ли другой недостаток, если вы сделаете это таким образом по сравнению с LINQ? Лично я нашел этот метод наиболее простым, по крайней мере, для моих нужд.
Kolors
6
Я написал это до того, как начал использовать LINQ. LINQ хорош и может быть легче читаемым. Я в основном использую LINQ сам в эти дни. Но некоторые компоненты действительно нуждаются в объектах XML старого стиля, поэтому он все еще используется время от времени. Я бы порекомендовал попробовать и «старый стиль» здесь, и LINQ и посмотреть, что вам подходит.
Wolf5
1
Разве XmlNode node = XmlDocument.Docu...линия не должна быть на самом деле XmlNode = doc.Docu...? Почему ответ был изменен и doc.удален?
wasatchwizard
Правда. Я понятия не имею, почему я изменил это ... Исправлю.
// Loading from a file, you can also load from a streamvar xml =XDocument.Load(@"C:\contacts.xml");// Query the data and write out a subset of contactsvar query =from c in xml.Root.Descendants("contact")where(int)c.Attribute("id")<4select c.Element("firstName").Value+" "+
c.Element("lastName").Value;foreach(string name in query){Console.WriteLine("Contact's Full Name: {0}", name);}
XDocument.Parse ( "<XML> что - то </ XML>"); для строки.
Wolf5
2
Люди, которые не включают в себя, являются подлыми, спасибо за ответ, хотя :)
Габриэль Гарсия
@GabrielGarcia правда, иногда новичок застревает в ошибке отсутствующего включения
Аноним
1
Какие соответствующие включает в себя?
скажем
18
Вот приложение, которое я написал для чтения файлов Sitemap xml:
usingSystem;usingSystem.Collections.Generic;usingSystem.Windows.Forms;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.IO;usingSystem.Data;usingSystem.Xml;namespaceSiteMapReader{classProgram{staticvoidMain(string[] args){Console.WriteLine("Please Enter the Location of the file");// get the location we want to get the sitemaps from string dirLoc =Console.ReadLine();// get all the sitemaps string[] sitemaps =Directory.GetFiles(dirLoc);StreamWriter sw =newStreamWriter(Application.StartupPath+@"\locs.txt",true);// loop through each file foreach(string sitemap in sitemaps){try{// new xdoc instance XmlDocument xDoc =newXmlDocument();//load up the xml from the location
xDoc.Load(sitemap);// cycle through each child noed foreach(XmlNode node in xDoc.DocumentElement.ChildNodes){// first node is the url ... have to go to nexted loc node foreach(XmlNode locNode in node){// thereare a couple child nodes here so only take data from node named loc if(locNode.Name=="loc"){// get the content of the loc node string loc = locNode.InnerText;// write it to the console so you can see its working Console.WriteLine(loc +Environment.NewLine);// write it to the file
sw.Write(loc +Environment.NewLine);}}}}catch{}}Console.WriteLine("All Done :-)");Console.ReadLine();}staticvoid readSitemap(){}}}
XmlSerializer. используйте класс с целевой схемой, которую вы хотите прочитать - используйте XmlSerializer для загрузки данных в Xml, загруженных в экземпляр класса.
Кроме того, VB.NET имеет гораздо лучшую поддержку синтаксического анализа XML через компилятор, чем C #. Если у вас есть выбор и желание, проверьте его.
"Все неправильно"? Я думаю, что это не совсем точно, если только это утверждение не шутит. ОП не предоставил никакой информации. о версии .NET, над которой он работает.
Cerebrus
1
Хех да Это было в шутку, но я не смешной, поэтому я убрал это.
7
Вы можете использовать DataSet для чтения строк XML.
var xmlString =File.ReadAllText(FILE_PATH);var stringReader =newStringReader(xmlString);var dsSet =newDataSet();
dsSet.ReadXml(stringReader);
очень хорошо! Это самый быстрый способ найти информацию из столбцов sql xml и .net !!
elle0087
Не идеально, если у вас есть несколько уровней, поскольку каждый уровень помещается в отдельную таблицу в наборе данных.
Lenny K
Это все еще хорошо для этого даже. Я полагаю, что это действительно зависит от того, как на самом деле выглядят ваши данные, и от того, сколько слоев данных вы ищете.
publicvoidReadXmlFile(){string path =HttpContext.Current.Server.MapPath("~/App_Data");// Finds the location of App_Data on server.XmlTextReader reader =newXmlTextReader(System.IO.Path.Combine(path,"XMLFile7.xml"));//Combines the location of App_Data and the file namewhile(reader.Read()){switch(reader.NodeType){caseXmlNodeType.Element:break;caseXmlNodeType.Text:
columnNames.Add(reader.Value);break;caseXmlNodeType.EndElement:break;}}}
Вы можете избежать первого оператора и просто указать путь в конструкторе XmlTextReader.
Есть разные способы, в зависимости от того, где вы хотите получить. XmlDocument легче, чем XDocument, но если вы хотите минимально проверить, что строка содержит XML, то регулярное выражение, возможно, самый быстрый и легкий выбор, который вы можете сделать. Например, я реализовал Smoke Tests с SpecFlow для моего API, и я хочу проверить, является ли один из результатов в любом допустимом XML - тогда я бы использовал регулярное выражение. Но если мне нужно извлечь значения из этого XML, я бы проанализировал его с помощью XDocument, чтобы сделать это быстрее и с меньшим количеством кода. Или я бы использовал XmlDocument, если мне нужно работать с большим XML (а иногда я работаю с XML, которые составляют около 1 млн строк, даже больше); тогда я мог даже читать это построчно. Почему? Попробуйте открыть более 800 МБ частных байтов в Visual Studio; даже на производстве у вас не должно быть объектов размером более 2 ГБ. Вы можете с тверком, но вы не должны. Если вам придется анализировать документ, который содержит много строк, то эти документы, вероятно, будут CSV.
Я написал этот комментарий, потому что я вижу много примеров с XDocument. XDocument не подходит для больших документов или когда вы хотите только проверить, является ли содержимое XML действительным. Если вы хотите проверить, имеет ли смысл сам XML, тогда вам нужна схема.
Я также отклонил предложенный ответ, потому что считаю, что ему нужна вышеуказанная информация внутри себя. Представьте, что мне нужно проверить, является ли 200M XML 10 раз в час действительным XML. XDocument будет тратить кучу ресурсов.
prasanna venkatesh также утверждает, что вы можете попробовать заполнить строку в наборе данных, это также будет указывать на действительный XML.
Ответы:
XmlDocument для чтения XML из строки или из файла.
или
затем найдите узел под ним, т.е.
или
затем прочитайте текст внутри этого узла, как это
или прочитать атрибут
Всегда проверяйте наличие нулевого значения в атрибутах ["что-то"], поскольку оно будет нулевым, если атрибут не существует.
источник
XmlNode node = XmlDocument.Docu...
линия не должна быть на самом делеXmlNode = doc.Docu...
? Почему ответ был изменен иdoc.
удален?Пример LINQ to XML :
Ссылка : LINQ to XML на MSDN
источник
Вот приложение, которое я написал для чтения файлов Sitemap xml:
Код для вставки в корзину http://pastebin.com/yK7cSNeY
источник
Есть много способов, некоторые:
источник
Вы также можете:
Примеры приведены на страницах MSDN
источник
Linq to XML.
Кроме того, VB.NET имеет гораздо лучшую поддержку синтаксического анализа XML через компилятор, чем C #. Если у вас есть выбор и желание, проверьте его.
источник
Вы можете использовать DataSet для чтения строк XML.
Выкладываю это ради информации.
источник
Проверьте XmlTextReader класс, например.
источник
Вы можете избежать первого оператора и просто указать путь в конструкторе XmlTextReader.
источник
Есть разные способы, в зависимости от того, где вы хотите получить. XmlDocument легче, чем XDocument, но если вы хотите минимально проверить, что строка содержит XML, то регулярное выражение, возможно, самый быстрый и легкий выбор, который вы можете сделать. Например, я реализовал Smoke Tests с SpecFlow для моего API, и я хочу проверить, является ли один из результатов в любом допустимом XML - тогда я бы использовал регулярное выражение. Но если мне нужно извлечь значения из этого XML, я бы проанализировал его с помощью XDocument, чтобы сделать это быстрее и с меньшим количеством кода. Или я бы использовал XmlDocument, если мне нужно работать с большим XML (а иногда я работаю с XML, которые составляют около 1 млн строк, даже больше); тогда я мог даже читать это построчно. Почему? Попробуйте открыть более 800 МБ частных байтов в Visual Studio; даже на производстве у вас не должно быть объектов размером более 2 ГБ. Вы можете с тверком, но вы не должны. Если вам придется анализировать документ, который содержит много строк, то эти документы, вероятно, будут CSV.
Я написал этот комментарий, потому что я вижу много примеров с XDocument. XDocument не подходит для больших документов или когда вы хотите только проверить, является ли содержимое XML действительным. Если вы хотите проверить, имеет ли смысл сам XML, тогда вам нужна схема.
Я также отклонил предложенный ответ, потому что считаю, что ему нужна вышеуказанная информация внутри себя. Представьте, что мне нужно проверить, является ли 200M XML 10 раз в час действительным XML. XDocument будет тратить кучу ресурсов.
prasanna venkatesh также утверждает, что вы можете попробовать заполнить строку в наборе данных, это также будет указывать на действительный XML.
источник