XPath访问非统一的XML文件

时间:2012-09-16 04:52:40

标签: c# xml c#-4.0 xpath

我有一个XML文件,其模型类似于以下内容:

<data>
    <customer>
        <id></id>
        <name></name>
        <model>
            <id></id>
            <name></name>
            <item>
                <id></id>
                <history>
                    <date></date>
                    <location></location>
                </history>
            </item>
            <item>
                <id></id>
                <history>
                    <date></date>
                    <location></location>
                </history>
            </item>
        </model>
        <model>
            <id></id>
            <name></name>
            <item>
                <id></id>
                <history>
                    <date></date>
                    <location></location>
                </history>
            </item>
        </model>
    </customer>
    <customer>
        <id></id>
        <name></name>
        <model>
            <id></id>
            <name></name>
            <item>
                <id></id>
                <history>
                    <date></date>
                    <location></location>
                </history>
            </item>
            <item>
                <id></id>
                <history>
                    <date></date>
                    <location></location>
                </history>
            </item>
        </model>
    </customer>
    <customer>
        <id></id>
        <name></name>
    </customer>
</data>

在C#中使用XPath,我需要为每个客户访问以下内容:

customer/id
customer/name
customer/model/id
customer/model/name
customer/model/item/id
customer/model/item/history/date
customer/model/item/history/location

当任何给定客户的数据不存在时,存储的结果将为null,因为必须填充客户对象的所有字段。如果XML文件是统一的,这将很容易。我的问题是当每个客户可能具有不同数量的模型和项目节点时访问每个客户的数据。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

假设结果将包含以下类型的对象:

Customer, Model, Item and History

填充它们的伪代码是:

  1. 选择所有/data/customer元素

  2. 对于1. do:

  3. 中选择的每个节点
  4. 选择./id./name并填充对象的相应属性。

  5. 填充当前List<Model>元素的所有model子项的customer属性:

  6. 选择当前元素的所有./model子项。

  7. 对于5.中的每个选定的model元素,创建一个Model对象并填充其属性:

  8. 对于当前的Model对象,通过选择当前./id元素的./namemodel子元素来填充其Id和Name属性。

  9. 填充当前List<Item>元素的所有item子项的model属性:

  10. 选择当前元素的所有./item子项。

  11. 对于当前Item对象,通过选择当前./id元素的item子元素来填充其Id属性。

  12. 以类似的方式使用History对象填充Item对象的History属性,您可以从当前./history元素的item子级创建和填充。

  13. 当然,如果您使用XML序列化,则可以跳过所有这些 - 请在此处阅读:http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx