从 XML 生成 C# 类

Posted

技术标签:

【中文标题】从 XML 生成 C# 类【英文标题】:Generate C# class from XML 【发布时间】:2011-05-11 08:27:42 【问题描述】:

我可以从 XML 文件生成 C# 类吗?

【问题讨论】:

How to generate .NET 4.0 classes from xsd?的可能重复 【参考方案1】:

是的,使用xsd.exe

D:\temp>xsd test.xml
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'D:\temp\test.xsd'.

D:\temp>xsd test.xsd /classes
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'D:\temp\test.cs'.

备注

回答how to change directory in Developer Command Prompt 到 d:\temp 可能会有用。

如果你为多维数组生成类,XSD.exe生成器有一个bug,但是there are workarounds。

【讨论】:

要使用xsd,请在您的工具菜单下运行VS2013 的开发人员命令提示符 xsd.exe 可以在以下位置找到:C:\Program Files (x86)\Microsoft SDKs\Windows 请注意,如果您有一个大型复杂 XML 文件,生成的类将非常难看,几乎无法使用;) 对我来说 xsd.exe 位于:C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools 我有一个 7GB 的 XML 文件(在这种情况下,它被用作二进制数据传输机制的人类可读转换),并且 xsd.exe 在试图快速读取该文件时耗尽了内存。请注意,这不是机器本身内存不足的情况;这台机器上有很多内存(192GB),xsd.exe 在死前使用不超过 4 个内存。所以这个解决方案不会是每个人的答案。【参考方案2】:

你应该考虑 svcutil (svcutil question)

xsd.exe 和 svcutil 都在 XML 架构文件 (.xsd) 上运行。您的 XML 必须符合供这两种工具使用的架构文件。

请注意,为此还存在各种第 3 方工具。

【讨论】:

【参考方案3】:

您可以按照 Darin 的建议使用 xsd。

除此之外,建议编辑 test.xsd 文件以创建更合理的架构。

type="xs:string" 可以更改为type="xs:int" 用于整数值minOccurs="0" 可以更改为minOccurs="1",其中该字段是必填字段maxOccurs="unbounded" 可以更改为maxOccurs="1",其中只有一个允许的项目

如果您想进一步验证您的数据,您可以创建更高级的 xsd-s,但这至少会在生成的 c# 中为您提供合理的数据类型。

【讨论】:

【参考方案4】:

我意识到这是一篇相当老的帖子,你可能已经继续前进了。

但我遇到了和你一样的问题,所以我决定编写自己的程序。

对我来说,“xml -> xsd -> classes”路线的问题在于它刚刚生成 一堆完全无法维护的代码,我最终把它搞砸了。

这绝不是优雅的,但它为我完成了这项工作。

你可以在这里得到它:如果你喜欢,请提出建议。

SimpleXmlToCode

【讨论】:

产生错误代码: // ELEMENTS [XmlIgnore] public DateTime Value get;放; [XmlText] 公共字符串 ValueString 获取 返回值? “真假”; 设置 价值 = 价值 == “真”; 并且构造函数是不必要的 + 你应该包括公开可见成员的 cmets 在我的辩护中,这是我非常迅速地拍打在一起的东西,这对我很有用。我还没有回到它,但随时可以为 repo 做出任何更改。 我已经使用它几个月了——它并不完美,但它非常有用,我发现它生成的 XML 比 VS2013 的粘贴为 XML 更易读/更简单。非常感谢 Talon。【参考方案5】:

如果您在 VS 2012(或更高版本)中处理 .NET 4.5 项目,您可以特殊粘贴您的 XML 文件作为类。

    将 XML 文件的内容复制到剪贴板 在编辑器中,选择要粘贴课程的位置 从菜单中选择EDIT > Paste Special > Paste XML As Classes

【讨论】:

我只希望生成自动实现的属性,就像“将 JSON 粘贴为类”一样。目前这意味着 6 倍臃肿的代码结果,更难阅读。不幸的是,仅这一点就让我寻找另一种工具。 这是 VS 2013 遗漏的吗? @Roger 我没用过 VS 2013,但我觉得应该有这个功能,确保你的项目是针对 .NET 4.5 Framework 这比xsd快很多,但是输出差不多。 如果您没有 resharper,请使用正则表达式替换为 public (\w+) (\w+)\r\n +\\r\n +get\r\n +\\r\n +return this.*;\r\n +\\r\n +set\r\n +\\r\n +this.*;\r\n +\\r\n +\\r\n => public $1 $2 get; set; 和 `private \w+ \w+Field;\r\n\r\n`【参考方案6】:

起初我以为 Paste Special 是圣杯!但后来我试了一下,我的头发变白了,就像印第安纳琼斯电影一样。

但现在我使用http://xmltocsharp.azurewebsites.net/,现在我和以前一样年轻。

这是它生成的一部分:

namespace Xml2CSharp

    [XmlRoot(ElementName="entry")]
    public class Entry 
        [XmlElement(ElementName="hybrisEntryID")]
        public string HybrisEntryID  get; set; 
        [XmlElement(ElementName="mapicsLineSequenceNumber")]
        public string MapicsLineSequenceNumber  get; set; 

【讨论】:

这个工具的输出很好,但我只想提醒大家不要向这个网站(或任何其他网站)提交任何敏感数据。虽然我很欣赏所提供的服务,但没有隐私政策,几乎不能保证您粘贴的内容不会被记录和检查等。 我有一个 xml 文件,它有一些递归关系(也许它被称为循环关系,我不确定。)其他失败但 xmltocsharp.azurewebsites.net 在那个 xml 上非常成功。 @D.Kermott 感谢网站链接,我快速浏览了一下,看起来它比特殊粘贴做得更好,代码看起来更干净,虽然我的测试xml 创建了更多的类,使用起来更好。 可惜它似乎颠倒了类的顺序(最后列出的外部元素) 只想指出这个工具没有正确设置XmlElement属性的Form property。这会使标准的 .NET xml 序列化程序静默失败(没有错误,但会创建一个空对象)。因此,如果 xml 混合了带有和不带有命名空间的元素,您将需要相应地更新代码。 xsd.exe 工具可以正确处理这个问题。【参考方案7】:

使用以下语法从 XSD 文件创建架构类。

C:\xsd C:\Test\test-Schema.xsd /classes /language:cs /out:C:\Test\

【讨论】:

【参考方案8】:

将 XML 转换为 C# 类:

导航到 Microsoft Visual Studio Marketplace: --https://marketplace.visualstudio.com 在搜索栏中输入文本: -- xml转类代码工具 下载、安装和使用应用程序

注意:随着时间的推移,这个应用程序可能会被替换,但很有可能会有另一个工具可以做同样的事情。

【讨论】:

【参考方案9】:

不久前发现了这个网站。它将 XML 和 JSON 转换为 C# 和 Java 类。有几个选项可以根据需要进行调整。我经常使用它。 https://json2csharp.com/xml-to-csharp

【讨论】:

以上是关于从 XML 生成 C# 类的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 中的类生成具有重复节点的 XML

使用 ArrayOfString 基于 XML 请求生成 C# 类

C#实体类生成XML与XML Schema文档

在 C# 中从 XML Schema 生成代码的限制是啥?

从 XSD 生成 PHP 类?

当数据集WriteXml()函数生成xml文件时,C#如何使用XDocument类更新xml文件