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

时间:2017-07-07 06:33:38

标签: c# xml xsd

我无法理解为什么C#代码生成器(xsd,xsd2code)生成输出类 Profile ,其中两个属性标注不同的属性。其中一个标记为 Unqualified ,其中一个不是。

我的XSD看起来像这样:

<?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>

输出xsd2code生成的代码:

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的确切输出,但它显示了困扰我的原因 - 为什么这两个属性没有标记相同的属性?

准备与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>  

问题的答案:&#34;为什么基于相同xsd的相同类型的两个属性标记有不同的属性&#34;不是我的主要关注点。由于我无法更改XSD文件(它们很久以前就被发送到客户端),我需要找到一种使用XML文件的方法,无论它们的元素是否标记了命名空间。目前,当我传递XML时,例如:

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

XmlSerializer 将返回解析错误。发送带有命名空间标记的所有参数的XML,或者没有命名空间,这将是很好的 - 只要它们被标记为一致就不重要。

提前感谢您帮助解决此问题。

附加说明:该示例已准备好简化附加代码,因此请不要担心 Profile 包含两个相同类型的属性。

1 个答案:

答案 0 :(得分:0)

生成两个属性的原因是:

elementFormDefault="unqualified">  

这意味着XML中的所有LOCAL元素都不应该被限定 - 应该使用空命名空间xmlns =&#34;&#34;来限定。换句话说,在给定的代码片段中:

<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定义,因为elementFormDefault =&#34;不合格&#34;在XML中将使用此xsd进行验证,有两个必需元素Parameteres,使用不同的命名空间进行限定。

要完全回答您的问题 - 我无法在xsd中更改或覆盖定义时看到解决方案。如果原始xsd中的Paramters元素具有属性minOccurs =&#34; 0&#34;可以省略它们。也许重新定义也是您的业务案例的选项(https://www.w3schools.com/xml/el_redefine.asp)。