从XSD生成的C#类包含具有不同限定属性的属性

问题描述:

我不明白为什么C#代码生成器(xsd,xsd2code)生成输出类配置文件具有两个标记了不同属性的相同类型的属性。其中一人被标记为不合格有一个没有了。从XSD生成的C#类包含具有不同限定属性的属性

我的XSD看起来是这样的:

using System.Collections.Generic; 
using System.Xml.Schema; 
using System.Xml.Serialization; 

namespace SO2_installation 
{ 
    public class ParameterList 
    { 
     public ParameterList() 
     { 
      Parameter = new List<ParameterItem>(); 
     } 

     public List<ParameterItem> Parameter { get; set; } 
    } 

    public class ParameterItem 
    { 
     public string Name { get; set; } 

     public string Value { get; set; } 
    } 

    public class Profile 
    { 
     public Profile() 
     { 
      Parameters1 = new List<ParameterItem>(); 
      Parameters = new List<ParameterItem>(); 
     } 

     [XmlArray(Order = 0)] 
     [XmlArrayItem("Parameter", IsNullable = false)] 
     public List<ParameterItem> Parameters { get; set; } 

     [XmlArray("Parameters", Form = XmlSchemaForm.Unqualified, Order = 1)] 
     [XmlArrayItem("Parameter", IsNullable = false)] 
     public List<ParameterItem> Parameters1 { get; set; } 
    } 
} 

的代码已经由R#简化,所以它不是从xsd2code精确的输出,而是:由xsd2code产生

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.acme.com" xmlns="http://www.acme.com" elementFormDefault="unqualified"> 
    <xsd:complexType name="ParameterList"> 
    <xsd:sequence> 
     <xsd:element ref="Parameter" minOccurs="0" maxOccurs="unbounded"/> 
    </xsd:sequence> 
    </xsd:complexType> 
    <xsd:complexType name="ParameterItem"> 
    <xsd:sequence> 
     <xsd:element name="Name" type="xsd:string" minOccurs="1" maxOccurs="1"/> 
     <xsd:element name="Value" type="xsd:string" minOccurs="1" maxOccurs="1"/> 
    </xsd:sequence> 
    </xsd:complexType> 
    <xsd:element name="Parameters" type="ParameterList" /> 
    <xsd:element name="Parameter" type="ParameterItem" /> 
    <xsd:element name="Profile"> 
    <xsd:complexType> 
     <xsd:sequence>   
     <xsd:element ref="Parameters" minOccurs="1" maxOccurs="1"/> 
     <xsd:element name="Parameters" type="ParameterList" minOccurs="1" maxOccurs="1"/>  
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

和输出代码它显示了困扰我的东西 - 为什么这两个属性没有标记相同的属性?

这是一个问题,同时准备与该XSD对应的XML文件。它应该看起来像下面这个,这使得准备非常容易出错。

<?xml version="1.0" encoding="utf-8"?>      
<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Parameters xmlns="http://www.acme.com">  
     <Parameter xmlns="http://www.acme.com"> 
      <Name xmlns="">SERIALNUMBER</Name> 
      <Value xmlns="">600001</Value> 
     </Parameter>   
    </Parameters>  
    <Parameters1 xmlns=""> 
     <Parameter xmlns="http://www.acme.com"> 
      <Name xmlns="">SERIALNUMBER</Name> 
      <Value xmlns="">600002</Value> 
     </Parameter>   
    </Parameters1>   
</Profile> 

的问题的答案:“为什么同样的类型,基于相同的XSD的两个属性都标有不同的属性,”是不是我的主要关注点。正如我不能改变XSD文件(他们在很久以前被送到客户端),我需要找到一种方法,无论消费XML文件的元素是否标有名称空间或没有。目前,当我通过使用XML,例如:

<Parameters1 xmlns="http://www.acme.com"> 

XmlSerializer的会返回一个解析错误。这将是很好的与带有命名空间,或者没有命名空间的所有参数发送XML - 无所谓,只要他们将始终如一地标。

预先感谢您帮助我这个问题。

附加说明:该示例准备简化附加代码,因此请不要在意配置文件包含两个相同类型的属性。

为什么两个属性产生的原因是:

elementFormDefault="unqualified"> 

这意味着,在XML中,所有的局部元素不应该是合格 - 应与空命名空间的xmlns =“”加以限定。在给定的代码片段换句话说:

<xsd:element name="Profile"> 
    <xsd:complexType> 
     <xsd:sequence>   
     <xsd:element ref="Parameters" minOccurs="1" maxOccurs="1"/> 
     <xsd:element name="Parameters" type="ParameterList" minOccurs="1" 
      maxOccurs="1"/>  
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

第一个元素参数是GLOBAL类型的XML中应与目标命名空间合格基准。为什么?因为无论属性elementFormDefault的值是什么,所有全局元素都应该使用目标名称空间进行限定。

第二个元素是新参数元素的LOCAL定义,并且由于XML中的elementFormDefault =“unqualified”将使用此xsd进行验证,因此有两个必需元素Parameteres,使用不同名称空间限定。

要完全回答您的问题 - 我无法在不更改或覆盖xsd中的定义的情况下看到解决方案。如果原始xsd中的参数元素具有属性minOccurs =“0”,则可以省略它们。也许重新定义也是您的商业案例的选项(https://www.w3schools.com/xml/el_redefine.asp)。