从XML查找节点并转换为类

时间:2010-12-28 13:58:54

标签: c# xml

这是我的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”类。一种可能的方式是

  • 使用XPathNavigator并找到Node。
  • 解析“Finded Node”并转换为特定类

这有点复杂。我必须处理所有属性及其数据类型。

我在寻找什么

  • 查找节点
  • 将节点转换为我的自定义类(我不想为Parser编写代码)

什么是最好的方法。我正在研究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.

1 个答案:

答案 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)
{
  ...
}