Решением этого является использование отражения с помощью 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, перечисляет каждое свойство, возвращает каждое свойство, являющееся интерфейсом, получает значение этого свойства (базового объекта), получает тип этого конкретного объекта помещает его в массив и добавляет это в список известных типов сериализатора.
Теперь сериализатор знает, как о типах, которые он сериализует, чтобы он мог выполнять свою работу.
Есть много способов, некоторые:
Вот приложение, которое я написал для чтения 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
Вы можете:
Примеры приведены на страницах msdn, предоставленных
// Загружая из файла, вы также можете загрузить из потока 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
Существуют разные способы, в зависимости от того, где вы хотите получить. 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.
Вы можете использовать DataSet для чтения XML-строк.
var xmlString = File.ReadAllText (FILE_PATH); var stringReader = new StringReader (xmlString); var dsSet = новый DataSet (); dsSet.ReadXml (StringReader);
Проводя это ради информации.
Например, посмотрите класс XmlTextReader .
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.
Кроме того, VB.NET имеет гораздо лучшую поддержку синтаксического анализа xml через компилятор, чем C #. Если у вас есть опция и желание, проверьте это.
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, если атрибут не существует.
узел XmlNode = XmlDocument.Docu ...
действительно быть XmlNode = doc.Docu ...
? Почему был изменен ответ, а документ
удален?
– wasatchwizard
3 November 2014 в 20:57