3

我想将没有任何与之关联的 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 中实现这一目标的最佳方法是什么?

4

6 回答 6

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>
于 2009-01-20T15:34:39.577 回答
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;
于 2009-01-20T15:50:33.397 回答
1

我会看看xsd.exe。您也可以在此处获取有关如何使用它的更多信息的教程。

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

于 2009-01-20T15:03:59.480 回答
1

Kevin Hazzard 使用 .NET 4.0 动态类型第 1部分和第 2部分为 C# 编写了流畅的 XML 接口。这将允许如下代码:

var v = dx.application.entities.entity[0].PropTest.Value;
于 2009-08-27T11:26:48.177 回答
0

如果您只是提取架构(使用 xsd.exe 应该很容易),那么这个在线工具(也可以下载)可以帮助您,我试过了,没关系。

于 2009-01-20T15:20:49.633 回答
0

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

于 2009-01-20T16:01:02.550 回答