我无法理解为什么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)。
| 归档时间: |
|
| 查看次数: |
634 次 |
| 最近记录: |