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

Paw*_*ski 5 c# xml xsd

我无法理解为什么C#代码生成器(xsd,xsd2code)生成具有两个标记有不同属性的相同类型属性的输出类Profile.其中一个标记为不合格,一个不标记.

我的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>
Run Code Online (Sandbox Code Playgroud)

并输出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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

代码已经被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>  
Run Code Online (Sandbox Code Playgroud)

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

<Parameters1 xmlns="http://www.acme.com">   
Run Code Online (Sandbox Code Playgroud)

XmlSerializer将返回解析错误.发送带有命名空间或没有命名空间的所有参数的XML会很好 - 只要它们被标记为一致就没关系.

提前感谢您帮助我解决这个问题.

附加说明:该例子准备简化附带的代码,所以请不要关心档案由同一类型的两个属性.

小智 0

生成两个属性的原因是:

elementFormDefault="unqualified">  
Run Code Online (Sandbox Code Playgroud)

这意味着 XML 中的所有 LOCAL 元素不应被限定 - 应使用空名称空间 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>   
Run Code Online (Sandbox Code Playgroud)

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

第二个元素是新的Parameters元素的本地定义,并且由于XML中的elementFormDefault =“unqualified”将使用此xsd进行验证,因此有两个强制元素Parameteres,使用不同的命名空间进行限定。

为了完全回答你的问题 - 如果不更改或覆盖 xsd 中的定义,我看不到解决方案。如果原始 xsd 中的 Paramters 元素具有属性 minOccurs="0",则可以省略它们。也许重新定义也是您业务案例的一个选择(https://www.w3schools.com/xml/el_redefine.asp)。