从 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# 类的主要内容,如果未能解决你的问题,请参考以下文章