xsd.exe 相关问题

XML模式定义(Xsd.exe)工具从XDR,XML和XSD文件或运行时程序集中的类生成XML模式或公共语言运行时类。它是Microsoft .NET SDK的一部分。

生成.xsd文件的C#类

我试图从 XML 模式生成一个 C# 类,但没有成功。 这是 VS 2017 的开发人员命令提示符中的命令: xsd 发票Api.xsd /类 输出: c: emp est>xsd invo...

回答 1 投票 0

如何防止 XSD.EXE 在生成的 C# 中将嵌套类型折叠为交错数组?

考虑以下 XSD: 考虑以下 XSD: <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="ContainingClass" type="ContainingClass" /> <xs:complexType name="ContainingClass"> <xs:sequence> <xs:element name="OuterArrayContainer" type="OuterArrayContainer" /> </xs:sequence> </xs:complexType> <xs:complexType name="OuterArrayContainer"> <xs:sequence> <xs:element minOccurs="1" maxOccurs="10" name="OuterArray" type="InnerArrayContainer" /> </xs:sequence> </xs:complexType> <xs:complexType name="InnerArrayContainer"> <xs:sequence> <xs:element minOccurs="1" maxOccurs="10" name="InnerArray" type="xs:int" /> </xs:sequence> </xs:complexType> </xs:schema> 假设上面的 XSD 位于名为“test.xsd”的文件中,我可以运行以下命令为其创建 C# 包装器: xsd test.xsd /c C# 输出如下所示(为简洁起见,删除 XML 属性后): public partial class ContainingClass { private int[][] outerArrayContainerField; public int[][] OuterArrayContainer { get { return this.outerArrayContainerField; } set { this.outerArrayContainerField = value; } } } 如您所见,它完全丢失了内部类型,并用单个锯齿状 int 数组替换了它们。我想保留内部类型。 如果我像这样向 XSD 添加虚拟元素: <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="ContainingClass" type="ContainingClass" /> <xs:complexType name="ContainingClass"> <xs:sequence> <xs:element name="OuterArrayContainer" type="OuterArrayContainer" /> </xs:sequence> </xs:complexType> <xs:complexType name="OuterArrayContainer"> <xs:sequence> <xs:element minOccurs="1" maxOccurs="10" name="OuterArray" type="InnerArrayContainer" /> <xs:element name="Dummy" type="xs:int" /> </xs:sequence> </xs:complexType> <xs:complexType name="InnerArrayContainer"> <xs:sequence> <xs:element minOccurs="1" maxOccurs="10" name="InnerArray" type="xs:int" /> <xs:element name="Dummy" type="xs:int" /> </xs:sequence> </xs:complexType> </xs:schema> 那么输出是: public partial class ContainingClass { private OuterArrayContainer outerArrayContainerField; public OuterArrayContainer OuterArrayContainer { get { return this.outerArrayContainerField; } set { this.outerArrayContainerField = value; } } } public partial class OuterArrayContainer { private InnerArrayContainer[] outerArrayField; private int dummyField; public InnerArrayContainer[] OuterArray { get { return this.outerArrayField; } set { this.outerArrayField = value; } } public int Dummy { get { return this.dummyField; } set { this.dummyField = value; } } } public partial class InnerArrayContainer { private int[] innerArrayField; private int dummyField; public int[] InnerArray { get { return this.innerArrayField; } set { this.innerArrayField = value; } } public int Dummy { get { return this.dummyField; } set { this.dummyField = value; } } } 这保留了内部类型,但代价是拥有未使用的虚拟属性。 我的问题是:有没有办法在不引入虚拟元素的情况下执行此操作(并且无需手动编辑输出 C# 代码)? (完全有可能我正在以完全错误的方式处理这件事......) 我的问题是:有没有办法在不引入虚拟元素的情况下执行此操作(并且无需手动编辑输出 C# 代码)? 简短的回答是否定的。在这个特定的实例中,这似乎是 XSD.exe 的一个错误,但即便如此,它通常对复杂类型的支持仍然很差,因为它生成的代码很大程度上是面向序列化/反序列化的,而不是面向模式的,因此它只付出了最小的努力来建模模式语义。 我建议使用另一个名为 'dotnet-xscgen' 的工具,来自 https://github.com/mganss/XmlSchemaClassGenerator(查看有关如何安装/使用它的说明此处) 它生成的代码仍然与 XSD.exe 非常相似(即 XmlSerializer 兼容),但有很大改进。运行原始架构(没有虚拟元素)时,它会生成以下代码(为了简洁起见,我删除了所有属性): // This code was generated by XmlSchemaClassGenerator version 2.1.1057.0 using the following command: // xscgen schema.xsd --namespace=Default public partial class ContainingClass { private System.Collections.ObjectModel.Collection<InnerArrayContainer> _outerArrayContainer; public System.Collections.ObjectModel.Collection<InnerArrayContainer> OuterArrayContainer { get { return _outerArrayContainer; } private set { _outerArrayContainer = value; } } /// <summary> /// <para xml:lang="en">Initializes a new instance of the <see cref="ContainingClass" /> class.</para> /// </summary> public ContainingClass() { this._outerArrayContainer = new System.Collections.ObjectModel.Collection<InnerArrayContainer>(); } } public partial class OuterArrayContainer { private System.Collections.ObjectModel.Collection<InnerArrayContainer> _outerArray; public System.Collections.ObjectModel.Collection<InnerArrayContainer> OuterArray { get { return _outerArray; } private set { _outerArray = value; } } /// <summary> /// <para xml:lang="en">Initializes a new instance of the <see cref="OuterArrayContainer" /> class.</para> /// </summary> public OuterArrayContainer() { this._outerArray = new System.Collections.ObjectModel.Collection<InnerArrayContainer>(); } } public partial class InnerArrayContainer { private System.Collections.ObjectModel.Collection<int> _innerArray; public System.Collections.ObjectModel.Collection<int> InnerArray { get { return _innerArray; } private set { _innerArray = value; } } /// <summary> /// <para xml:lang="en">Initializes a new instance of the <see cref="InnerArrayContainer" /> class.</para> /// </summary> public InnerArrayContainer() { this._innerArray = new System.Collections.ObjectModel.Collection<int>(); } } 微软似乎对改进 XML 工具不感兴趣,因此其他人已经填补了这个空缺。

回答 1 投票 0

选择相似序列

我有这个xsd文件: 我有这个xsd文件: <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://HIDDEN/Queues" xmlns="http://HIDDEN/Queues"> <xs:complexType name="Queue"> <xs:sequence> <xs:choice> <xs:sequence> <xs:element fixed="1" name="id" type="xs:long"/> <xs:element fixed="a" name="name" type="xs:string"/> </xs:sequence> <xs:sequence> <xs:element fixed="2" name="id" type="xs:long"/> <xs:element fixed="b" name="name" type="xs:string"/> </xs:sequence> </xs:choice> </xs:sequence> </xs:complexType> </xs:schema> 目标是类型为 Queue 的元素应该如下所示: <Queue> <id>1</id> <name>a</name> </Queue> 但是一旦 id 或 name 不匹配(例如 id=2 name=a),它就会失败。 我感到困惑的部分是这个错误: “http://HIDDEN/Queues”:id 和“http://HIDDEN/Queues”:id(或其替换组中的元素)违反“唯一粒子属性”。在针对此模式进行验证期间,这两个粒子将会产生歧义。 我的意思是我看到了它引用的内容,但这些元素不能同时存在,所以不知道如何解决这个问题。 我的一个想法是将 id 和 name 作为属性,但我的老板说我不能这样做(不要问我为什么)。 你们中有人知道其他方法吗? 预先感谢! 这是一个基于 XSD 1.1 的解决方案,它使用 assert 语句来强制执行 id 和 name 值的正确组合。 输入XML <Queue xmlns="http://HIDDEN/Queues"> <id>1</id> <name>a</name> </Queue> XSD 1.1 <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://HIDDEN/Queues" xmlns="http://HIDDEN/Queues" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1"> <xs:element name="Queue"> <xs:complexType> <xs:sequence> <xs:element ref="id"/> <xs:element ref="name"/> </xs:sequence> <xs:assert test="string-join((xs:string(id), name), '~') = ('1~a', '2~b')" xpathDefaultNamespace="##targetNamespace"> <xs:annotation> <xs:documentation>Rule #: 20-70</xs:documentation> <xs:documentation>Combination of id and name values shall be correct</xs:documentation> </xs:annotation> </xs:assert> </xs:complexType> </xs:element> <xs:element name="id" type="xs:integer"/> <xs:element name="name" type="xs:string"/> </xs:schema>

回答 1 投票 0

为 xml 模式中的简单类型生成正确的对象

我有 camt.026 ISO 消息的 ISO 20022 标准 .xsd 文件,以及它可以根据复杂类型 InvestigationStatus5Choice 上的 conf 元素使用的可能外部代码。 camt.026 xsd:...

回答 1 投票 0

是否可以从Mac OS使用XSD工具?

我刚刚开始一个项目,在这里我需要创建一个类来映射XSD文件中的所有XML属性。对于那些具有一些属性的对象,可以手动完成。对于那些具有很多属性的人,...

回答 1 投票 -1

同一个表'tableName'不能是两个嵌套关系中的子表

使用XSD.EXE我生成了一个* .cs文件来序列化XML。当我序列化时,我得到错误“同一个表'DefaultFont'不能是两个嵌套关系中的子表。”我为什么收到......

回答 1 投票 3

从使用XSD.exe生成的XML反序列化类

我有一个.xsd生成的类(使用xsd.exe),我可以序列化,但是当我尝试反序列化它时,我得到错误:{“

回答 2 投票 2

如何从类创建XSD架构?

我在使用XSD文件时遇到了困难。我正在尝试从类创建一个XSD文件:public enum Levels {Easy,Medium,Hard} public sealed class Configuration {public string Name {get; ...

回答 2 投票 46

如何将XML读入与其xsd匹配的类/类

所以我有一个XSD和一个以相同格式提供的web服务。现在我可以继续将xml读入文档,从类中创建我的对象等......但我在想,必须有......

回答 3 投票 12

在Windows 8上的visual studio 2013中找到xsd.exe的位置

我使用Visual Studio 2003和2008中的xsd.exe实用程序从第三方XSD文件生成类型化数据集。第三方已经改变了他们的架构,所以我需要重新生成数据集,但......

回答 5 投票 33

在Visual Studio中的MSBuild社区任务BeforeBuild步骤期间找不到路径中的xsd.exe

我正在使用MSBuild社区任务来运行Xsd.exe作为我在Visual Studio中构建的一部分,因为:

回答 2 投票 -1

如何将外部xsd导入另一个xsd?

我试图从xsd下面生成类,但它在生成相同的类时会抛出几个错误。我使用下面的命令从xsd:xsd下面生成类

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.