将XML文档转换为流畅的C#

时间:2009-01-20 15:00:28

标签: c# xml .net-3.5 xsd fluent-interface

我想将没有任何XSD架构的外部XML文档转换为流畅的.NET对象。

我有一个简单的XML文件,如:

<application>
    <parameters>
        <param></param>
        <param></param>
    </parameters>
    <generation />
    <entities>
        <entity ID="1">
            <PropTest>Test</PropTest>
        </entity>
        <entity ID="2">
            <PropTest>Another Test</PropTest>
        </entity>
     </entities>
</application>

我想将文档导航为:

var xConfig = new XmlConfig("file.xml");

// testValue should be assigned "Test"
string testValue = xConfig.Generation.Entities.Entity(1).PropTest;

在.NET 3.5中实现此目的的最佳方法是什么?

6 个答案:

答案 0 :(得分:2)

可以说,最近这样做的最好方法是使用Linq to XML。这比搞乱XSD和复杂的类定义要容易得多。

XDocument doc = XDocument.Load("file.xml");
var val = doc
    .Descendants("entity")
    .Where(p => p.Attribute("ID").Value == "1")
    .Descendants("PropTest")
    .FirstOrDefault();
if (val != null)
    Console.WriteLine(val.Value);

我使用的示例file.xml是:

<?xml version="1.0" encoding="utf-8" ?>
<application>
    <parameters>
        <param></param>
        <param></param>
    </parameters>
    <generation>
        <entities>
            <entity ID="1">
                <PropTest>Test</PropTest>
            </entity>
            <entity ID="2">Another Test</entity>
        </entities>
    </generation>
</application>

答案 1 :(得分:2)

我刚刚注意到Lusid在我写答案时也写了关于Linq to SQL的内容,但他使用了XDocument。

这是我的版本(file.xml是问题中给出的XML):

string testValue =
    (string) XElement.Load("file.xml")
        .Element("entities")
        .Elements("entity")
        .FirstOrDefault(entity => entity.Attribute("ID")
            .Value == "1") ?? string.Empty;

答案 2 :(得分:1)

我会看xsd.exe。您也可以访问here获取有关如何使用它的更多信息。

基本上,您将创建XSD的.NET类等价物。然后,您就可以序列化和反序列化XML和对象。

答案 3 :(得分:1)

Kevin Hazzard使用.NET 4.0动态类型part 1part 2为C#编写了一个流畅的XML接口。这将允许代码:

var v = dx.application.entities.entity[0].PropTest.Value;

答案 4 :(得分:0)

如果您只是提取架构(使用xsd.exe应该很容易),那么online tool(也可以下载)可以帮助您,我尝试了它就可以了。

答案 5 :(得分:0)

定义从ConfigurationSection / ConfigurationElement等派生的类。它们很好地映射到xml文件(这就是它们的内容)。请参阅MSDN。另一种方法是创建POCO对象并在属性上设置XML序列化属性,然后使用System.XML.XMLSerializer对XML进行序列化/反序列化。请参阅MSDN for XML Serialization。