【发布时间】:2011-05-11 08:27:42
【问题描述】:
我可以从 XML 文件生成 C# 类吗?
【问题讨论】:
我可以从 XML 文件生成 C# 类吗?
【问题讨论】:
是的,使用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
xsd.exe 位于:C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools
你应该考虑 svcutil (svcutil question)
xsd.exe 和 svcutil 都在 XML 架构文件 (.xsd) 上运行。您的 XML 必须符合供这两种工具使用的架构文件。
请注意,为此还存在各种第 3 方工具。
【讨论】:
您可以按照 Darin 的建议使用 xsd。
除此之外,建议编辑 test.xsd 文件以创建更合理的架构。
type="xs:string" 可以更改为type="xs:int" 用于整数值minOccurs="0" 可以更改为minOccurs="1",其中该字段是必填字段maxOccurs="unbounded" 可以更改为maxOccurs="1",其中只有一个允许的项目
如果您想进一步验证您的数据,您可以创建更高级的 xsd-s,但这至少会在生成的 c# 中为您提供合理的数据类型。
【讨论】:
我意识到这是一篇相当老的帖子,你可能已经继续前进了。
但我遇到了和你一样的问题,所以我决定编写自己的程序。
对我来说,“xml -> xsd -> classes”路线的问题在于它刚刚生成 一堆完全无法维护的代码,我最终把它搞砸了。
这绝不是优雅的,但它为我完成了这项工作。
你可以在这里得到它:如果你喜欢,请提出建议。
【讨论】:
如果您在 VS 2012(或更高版本)中处理 .NET 4.5 项目,您可以特殊粘贴您的 XML 文件作为类。
EDIT > Paste Special > Paste XML As Classes 【讨论】:
xsd快很多,但是输出差不多。
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`
起初我以为 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; }
【讨论】:
XmlElement属性的Form property。这会使标准的 .NET xml 序列化程序静默失败(没有错误,但会创建一个空对象)。因此,如果 xml 混合了带有和不带有命名空间的元素,您将需要相应地更新代码。 xsd.exe 工具可以正确处理这个问题。
使用以下语法从 XSD 文件创建架构类。
C:\xsd C:\Test\test-Schema.xsd /classes /language:cs /out:C:\Test\
【讨论】:
将 XML 转换为 C# 类:
注意:随着时间的推移,这个应用程序可能会被替换,但很有可能会有另一个工具可以做同样的事情。
【讨论】:
不久前发现了这个网站。它将 XML 和 JSON 转换为 C# 和 Java 类。有几个选项可以根据需要进行调整。我经常使用它。 https://json2csharp.com/xml-to-csharp
【讨论】: