从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)。