这是我的XML架构
<Modules>
<Module name="Sales" path="../SalesInfo.xml" isEnabled="true" ... >
..............
</Module>
<Module name="Purchase" path="../PurchaseInfo.xml" isEnabled="true" ... >
..............
</Module>
................
</Module>
</Modules>
SalesInfo.XML
<Screens>
<Screen name="SalesOrder" ........ />
</Screen>
public class Module
{
public string Name
{
get;
set;
}
public string Type
{
get;
set;
}
.....
}
这里模块和屏幕是基于请求加载的(“按需”)。因此,我必须在请求到来时找到特定节点(可能来自菜单点击)。选择节点后,需要将其转换为特定类。例如,当“sales”请求到来时,它应该从XML中选择并且需要转换为“Module”类。一种可能的方式是
这有点复杂。我必须处理所有属性及其数据类型。
我在寻找什么
什么是最好的方法。我正在研究C#4.0。
修改
XDocument document = XDocument.Load(path);
XElement mod = document.XPathSelectElement("Modules/Module[@name='PurchaseEnquiry']") as XElement;
Module purchaseModule = mod as Module; //This won't work, but i want like this.
答案 0 :(得分:1)
嗯......不完全确定你在寻找什么,但我会试一试 您可以逐节点地读取内容,并将每个节点反序列化到您的类中,如下所示:
public class XmlDataReader<T> : IEnumerable, IDisposable
{
private readonly XmlTextReader reader = null;
public XmlDataReader(string filename)
{
reader = new XmlTextReader(filename) {WhitespaceHandling = WhitespaceHandling.None};
reader.MoveToContent(); // Go to root node.
reader.Read(); // Go to first child node.
}
#region Implementation of IEnumerable
public IEnumerator GetEnumerator()
{
if (reader == null) yield break;
do
{
var ser = new XmlSerializer(typeof (T));
var subTree = reader.ReadSubtree();
subTree.MoveToContent();
var node = ser.Deserialize(subTree);
subTree.Close();
yield return node;
reader.Skip();
} while (!reader.EOF && reader.IsStartElement());
}
#endregion
#region Implementation of IDisposable
public void Dispose()
{
if (reader != null)
reader.Close();
}
#endregion
}
在你的情况下,你可以像这样使用它:
var reader = new XmlDataReader<Module>("data.xml");
foreach (Module node in reader)
{
...
}