xsd.exe 生成正确的类型

Posted

技术标签:

【中文标题】xsd.exe 生成正确的类型【英文标题】:xsd.exe generate proper type 【发布时间】:2022-01-20 22:42:35 【问题描述】:

"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\xsd.exe"

/order /n:eDD.KlasyXML /c /language:CS

生成我的 C# 代码。

Woks 很好,但我的 xsd 文件包含类型定义,例如:

  <!--==========================================================-->
  <!--===                    QuantityType                    ===-->
  <!--==========================================================-->
  <xs:simpleType name="QuantityType">
    <xs:annotation>
      <xs:documentation>
        <doc:description value="Quantity" />
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:decimal">
      <xs:totalDigits value="15" />
      <xs:fractionDigits value="3" />
      <xs:minExclusive value="0" />
      <xs:pattern value="[1-9]\d0,14" />
      <xs:pattern value="([1-9]\d0,13|0)\.[0-9]" />
      <xs:pattern value="([1-9]\d0,12|0)\.\d[0-9]" />
      <xs:pattern value="([1-9]\d0,11|0)\.\d\d[0-9]" />
    </xs:restriction>
  </xs:simpleType>

元素定义如下:

<xs:element name="Quantity" type="emcs:QuantityType"/>

但是 XML 中的输出看起来像这样:

<q4:Quantity>2000.0000</q4:Quantity>

有没有办法强制 xsd.exe 尊重类型定义并以正确的格式输出 xml,如下所示:

<q4:Quantity>2000.000</q4:Quantity>

这就是我将对象转换为字符串的方式:

public static string XMLToString<T>(this T toSerialize)

    StreamReader streamReader = null;
    MemoryStream memoryStream = null;
    try
    
        XmlSchemaSet schema = new XmlSchemaSet();
        schema.Add("eDD.SchematyXML", "traderToEdd.xsd");

        memoryStream = new MemoryStream();
        XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();

        XmlWriter xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings);
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
        xmlSerializer.Serialize(xmlWriter, toSerialize);
        memoryStream.Seek(0, SeekOrigin.Begin);
        streamReader = new StreamReader(memoryStream);
        return streamReader.ReadToEnd();
    
    finally
    
        if ((streamReader != null))
        
            streamReader.Dispose();
        
        if ((memoryStream != null))
        
            memoryStream.Dispose();
        
    

如何为此添加架构或命名空间?

【问题讨论】:

模式中的小数位数为 3,您将获得四位数。看起来您在编写结果时没有引用架构。 q4 命名空间表明架构(或命名空间)未正确添加到您的 xml 编写器。 如何向 XmlSerializer 添加架构定义? xml文件中的URL属性为schema。 【参考方案1】:

我可能做错了什么,但它对我不起作用。我试过了,但无论我做什么都失败了。 解决方案是使用 xsd2code。它可以生成分数数字属性等等。它不是免费的,但值得一分钱。

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于xsd.exe 生成正确的类型的主要内容,如果未能解决你的问题,请参考以下文章

让 xsd.exe 生成俄罗斯娃娃风格的文件

是否有与 xsd.exe 等效的 JSON?

引用通用类型的 XSD Gen 类

多个 xsd 文件的 xsd.exe 类生成器问题

关于包含文件和代码生成的 XSD.exe 问题

XSD.exe 自动在关联属性的 setter 中设置生成的指定字段