Отличным примером в .NET Framework является интерфейс INotifyPropertyChanged . Этот интерфейс состоит только из одного члена: события PropertyChanged .
В WPF вы можете указать, что элемент управления будет отображать определенное свойство экземпляра объекта. Но как этот элемент управления обновится, если изменится базовое свойство?
Если связанный объект реализует интерфейс INotifyPropertyChanged , среда WPF может просто прослушать PropertyChanged и обновить соответствующим образом.
Похоже, вы больше после простого синтаксического анализа, а не после полной сериализации / десериализации XML. Если вы можете использовать LINQ to XML, это довольно просто:
using System;
using System.Linq;
using System.Xml.Linq;
public class Test
{
static void Main()
{
string xml = "<Ids><id>1</id><id>2</id></Ids>";
XDocument doc = XDocument.Parse(xml);
var list = doc.Root.Elements("id")
.Select(element => element.Value)
.ToList();
foreach (string value in list)
{
Console.WriteLine(value);
}
}
}
Фактически, вызов Elements
может опустить аргумент, поскольку там есть только только id
элементов. , но я подумал, что продемонстрирую, как указать, какие элементы вам нужны.
Точно так же я обычно не утруждал себя вызовом ToList
, если мне действительно не нужен был List
- без него результатом будет IEnumerable
, что нормально, если вы просто повторяете его один раз. Чтобы вместо этого создать массив, используйте ToArray
.
Вот способ использования XmlDocument:
// A string containing the XML data
string xml = "<Ids><id>1</id><id>2</id></Ids>";
// The list you want to fill
ArrayList list = new ArrayList();
XmlDocument doc = new XmlDocument();
// Loading from a XML string (use Load() for file)
doc.LoadXml(xml);
// Selecting node using XPath syntax
XmlNodeList idNodes = doc.SelectNodes("Ids/id");
// Filling the list
foreach (XmlNode node in idNodes)
list.Add(node.InnerText);
Этот образец будет работать с .NET framework 3.5:
System.Xml.Linq.XElement element = System.Xml.Linq.XElement.Parse("<Ids> <id>1</id> <id>2</id></Ids>");
System.Collections.Generic.List<string> ids = new System.Collections.Generic.List<string>();
foreach (System.Xml.Linq.XElement childElement in element.Descendants("id"))
{
ids.Add(childElement.Value);
}
Вы можете использовать класс Properties.
Properties prop = new Properties();
prop.loadFromXML(stream);
Set set = prop.keySet();
Вы можете получить доступ к строкам из набора для каждого ключа. Ключ - это имя элемента xml.
Вот способ получить типизированный массив из xml с помощью DataSets. (в данном примере - массив двойников)
DataSet dataSet = new DataSet()
DoubleArray doubles = new DoubleArray(dataSet,0);
dataSet.ReadXml("my.xml");
double a = doubles[0];
public class DoubleArray
{
DataSet dataSet;
int tableIndex;
public DoubleArray(DataSet dataSet,int tableIndex)
{
this.dataSet=dataSet;
this.tableIndex=tableIndex;
}
public double this[int index]
{
get
{
object ret = dataSet.Tables[tableIndex].Rows[index];
if(ret is double?)
return (ret as double?).Value;
else
return double.Parse(ret as string);
}
set
{
object out = dataSet.Tables[tableIndex].Rows[index];
if(out is double?)
dataSet.Tables[tableIndex].Rows[index] = (double?)value;
else
dataSet.Tables[tableIndex].Rows[index] = value.ToString();
}
}
}
Конечно, постоянный синтаксический анализ двойников и их преобразование обратно в строки некоторыми программистами может рассматриваться как богохульство ... Даже мне было трудно не думать о такой трате ресурсов. .. но я думаю, иногда лучше просто отвернуть другого .. не подчеркивайте это :)