我无法理解为什么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 包含两个相同类型的属性。
答案 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)。