如何基于元素或属性创建对象

时间:2011-11-28 12:57:23

标签: c# xml parsing linq-to-xml

在解析以下XML方面需要帮助。我是Linq to XML的新手。 我想解析单个对象数组中的所有图片数据,我似乎找不到方法,

以下是xml示例

<Object type="System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="Form1" children="Controls">
    <Object type="System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="PictureBox1" children="Controls">
        <Property name="TabIndex">0</Property>
        <Property name="Size">206, 152</Property>
        <Property name="ImageLocation">C:\Documents and Settings\Administrator\Desktop\logo2w.png</Property>
        <Property name="Location">41, 68</Property>
        <Property name="TabStop">False</Property>
        <Property name="Name">PictureBox1</Property>
        <Property name="DataBindings">
            <Property name="DefaultDataSourceUpdateMode">OnValidation</Property>
        </Property>
    </Object>
    <Object type="System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="PictureBox2" children="Controls">
        <Property name="TabIndex">0</Property>
        <Property name="Size">206, 152</Property>
        <Property name="ImageLocation">C:\Documents and Settings\Administrator\Desktop\logo2w.png</Property>
        <Property name="Location">42, 68</Property>
        <Property name="TabStop">False</Property>
        <Property name="Name">PictureBox2</Property>
        <Property name="DataBindings">
            <Property name="DefaultDataSourceUpdateMode">OnValidation</Property>
        </Property>
    </Object>    
</Object>

我希望以[{1}},PictureObjects[0].Location = 41, 68等方式访问该值,我可以这样做吗?

我看到了几个样本,我可以根据节点名称创建这样的对象,而不是基于nodes属性值? C# LINQ with XML, cannot extract multiple fields with same name into object

有人可以指导或让我知道它是否可行?

1 个答案:

答案 0 :(得分:1)

你可以从这开始,下面的代码只选择TabIndex和Size属性,显然添加其他代码并不是一件小事:

 XDocument xdoc = XDocument.Load(@"path to a file or use text reader");
 var tree = xdoc.Descendants("Object").Skip(1).Select(d =>
            new
            {
                Type = d.Attribute("type").Value,
                Properties = d.Descendants("Property")
            }).ToList();

 var props = tree.Select(e =>
    new
    {
        Type = e.Type,
        TabIndex = e.Properties
                    .FirstOrDefault(p => p.Attribute("name").Value == "TabIndex")
                    .Value,
        Size = e.Properties
                .FirstOrDefault(p => p.Attribute("name").Value == "Size")
                .Value
    });