【问题标题】:Converting an XML document to fluent C#将 XML 文档转换为流利的 C#
【发布时间】:2009-01-20 15:00:28
【问题描述】:

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

【问题讨论】:

  • 动态 C# 4.0 的潜在用途?

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


【解决方案1】:

可以说,目前最好的方法是使用 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>

【讨论】:

  • 这比问题中给出的示例可读性差得多。这真的是我们可以用 LINQ 做的最好的事情吗?
  • 问题中给出的示例假定已生成一组强类型类以匹配正在加载的 XML 结构。由于我们(还)不能构建动态类,所以是的,这是我们可以用 LINQ 做的最好的事情。像 Ruby 和 PHP 这样的动态语言可以使用流畅的语法来做到这一点,就像他在动态中描述的那样,而不必提前知道架构。
【解决方案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;

【讨论】:

    【解决方案3】:

    我会看xsd.exe。您也可以前往here 获取更多关于如何使用它的信息教程。

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

    【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-02-17
          • 2015-06-03
          • 1970-01-01
          • 1970-01-01
          • 2012-03-07
          • 2017-05-27
          • 2010-11-19
          相关资源
          最近更新 更多