当前位置: 首页 > news >正文

使用 LINQ to XML,.NET 让生成 XML 文件变得和直接写 XML 一样轻松

由 .NET Framework 3.5 引入,并依然在 .NET Core 中发扬光大的 LINQ to XML 让编写 XML 文件变得非常轻松。


使用 XElementXAttribute 我们能够完整构造一个 XML 出来。为了能直观地体会到优势,我写一个最简单的例子:

var root = new XElement("Root",
    new XAttribute("Attribute", "Walterlv"),
    new XElement("Node", "Content")
);

构造出来的 XML 将是这样的:

<Root Attribute="Walterlv">
  <Node>Content</Node>
</Root>

是不是觉得包括行的安排和缩进在内,都和 XML 一样简单?

我们来看一个更复杂的例子,这是直接在编写一个 NuGet 的 nuspec 文件:

var xmlns = "http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd";
var root = new XElement("package",
    new XAttribute(XNamespace.Xmlns.ToString(), xmlns),
    new XElement("metadata",
        new XElement("id", "MSTestEnhancer"),
        new XElement("version", "1.6.0"),
        new XElement("authors", "walterlv"),
        new XElement("owners", "walterlv"),
        new XElement("requireLicenseAcceptance", "false"),
        new XElement("licenseUrl", "https://github.com/dotnet-campus/MSTestEnhancer/blob/master/LICENSE"),
        new XElement("projectUrl", "https://dotnet-campus.github.io/mstest-enhancer"),
        new XElement("iconUrl", "https://dotnet-campus.github.io/mstest-enhancer/icon.png"),
        new XElement("description", "MSTestEnhancer helps you to write unit tests without naming any method. You can write method contract descriptions instead of writing confusing test method name when writing unit tests."),
        new XElement("releaseNotes", "Support passing null into WithArgument method."),
        new XElement("copyright", "Copyright (c) 2018 dotnet职业技术学院"),
        new XElement("repository",
            new XAttribute("type", "git"),
            new XAttribute("url", "https://github.com/dotnet-campus/MSTestEnhancer.git")),
        new XElement("dependencies", dependencies.Select(group => new XElement("group",
            new XAttribute("targetFramework", group.Key), group.Value.Select(x =>
                new XElement("dependency",
                    new XAttribute("id", x.id),
                    new XAttribute("version", x.version),
                    new XAttribute("exclude", x.exclude)))))
        )
    ));
var document = new XDocument(root);
document.Save(@"C:\Users\walterlv\Desktop\Walterlv.Demo.nuspec");

其中的 dependencies 集合我写在了其他地方,这样更像是动态生成,而不是仅仅为了给一个例子。

var dependencies = new Dictionary<string, (string id, string version, string exclude)[]>
{
    [".NETFramework4.5"] = new[]
    {
        ("MSTest.TestFramework", "1.2.0", "Build,Analyzers"),
        ("System.ValueTuple", "4.4.0", "Build,Analyzers"),
    },
    [".NETFramework4.7"] = new[]
    {
        ("MSTest.TestFramework", "1.2.0", "Build,Analyzers"),
    },
    [".NETStandard2.0"] = new[]
    {
        ("MSTest.TestFramework", "1.2.0", "Build,Analyzers"),
    }
};

生成的 nuspec 文件非常像 NuGet 的原生 nuspec 文件。

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
  <metadata>
    <id>MSTestEnhancer</id>
    <version>1.6.0</version>
    <authors>walterlv</authors>
    <owners>walterlv</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <licenseUrl>https://github.com/easiwin/MSTestEnhancer/blob/master/LICENSE</licenseUrl>
    <projectUrl>https://easiwin.github.io/mstest-enhancer</projectUrl>
    <iconUrl>https://easiwin.github.io/mstest-enhancer/icon.png</iconUrl>
    <description>MSTestEnhancer helps you to write unit tests without naming any method. You can write method contract descriptions instead of writing confusing test method name when writing unit tests.</description>
    <releaseNotes>Support passing null into WithArgument method.</releaseNotes>
    <copyright>Copyright (c) 2018 dotnet职业技术学院</copyright>
    <repository type="git" url="https://github.com/easiwin/MSTestEnhancer.git" />
    <dependencies>
      <group targetFramework=".NETFramework4.5">
        <dependency id="MSTest.TestFramework" version="1.2.0" exclude="Build,Analyzers" />
        <dependency id="System.ValueTuple" version="4.4.0" exclude="Build,Analyzers" />
      </group>
      <group targetFramework=".NETFramework4.7">
        <dependency id="MSTest.TestFramework" version="1.2.0" exclude="Build,Analyzers" />
      </group>
      <group targetFramework=".NETStandard2.0">
        <dependency id="MSTest.TestFramework" version="1.2.0" exclude="Build,Analyzers" />
      </group>
    </dependencies>
  </metadata>
</package>

参考资料

  • LINQ to XML 与DOM (C#) - Microsoft Docs
  • 如何:控制命名空间前缀 (C#) (LINQ to XML) - Microsoft Docs

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • git subtree 不断增加的推送时间,解不玩的冲突!这篇文章应该能救你
  • 阻止某个 NuGet 包意外升级
  • 解读 Microsoft.NET.Sdk 的源码,你能定制各种奇怪而富有创意的编译过程
  • 在 Visual Studio 的解决方案资源管理器中隐藏一些文件
  • 长期支持 LTS(Long-term Support)是怎样的一种支持方式
  • .NET Standard 的管理策略
  • 如何在 .NET/C# 代码中安全地结束掉一个控制台应用程序?通过发送 Ctrl+C 信号来结束
  • Windows 10 应用创建模糊背景窗口的三种方法
  • 使用 PInvoke.net Visual Studio Extension 辅助编写 Win32 函数签名
  • 程序员与英语:即时聊天中的英语缩写 lol / lmao / idk
  • 使用 IFTTT 做 RSS 的邮件订阅服务
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • 语法高亮不够漂亮?这里有你想要的 Rouge 主题
  • 理解 UWP 视图的概念,让 UWP 应用显示多个窗口(多视图)
  • UWP 扩展/自定义标题栏的方法,一些概念和一些注意事项
  • input实现文字超出省略号功能
  • JavaScript 基础知识 - 入门篇(一)
  • Java方法详解
  • react 代码优化(一) ——事件处理
  • SpringCloud集成分布式事务LCN (一)
  • 关于for循环的简单归纳
  • 关于springcloud Gateway中的限流
  • 如何进阶一名有竞争力的程序员?
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 项目实战-Api的解决方案
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • (2015)JS ES6 必知的十个 特性
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (libusb) usb口自动刷新
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二)springcloud实战之config配置中心
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (四)库存超卖案例实战——优化redis分布式锁
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .net 4.0发布后不能正常显示图片问题
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET 药厂业务系统 CPU爆高分析
  • [100天算法】-不同路径 III(day 73)
  • [20150321]索引空块的问题.txt
  • [20190416]完善shared latch测试脚本2.txt
  • [BZOJ3211]:花神游历各国(小清新线段树)
  • [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强
  • [hive] posexplode函数
  • [iOS]GCD(一)
  • [javaSE] GUI(事件监听机制)
  • [Oh My C++ Diary]内联函数
  • [StartingPoint][Tier1]Crocodile
  • [VS] 诊断工具,检测内存泄漏,进行内存调优
  • [改善Java代码]让工具类不可实例化