gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 01:59:19 25 4
gpt4 key购买 nike

我无法理解为什么 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>

以及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>

问题的答案:“为什么相同类型的两个属性,基于相同的 xsd 标记有不同的属性”不是我主要关心的问题。由于我无法更改 XSD 文件(它们很久以前就已发送给客户端),因此我需要找到一种方法来使用 XML 文件,而不管它们的元素是否标有 namespace 。目前,当我传递 XML 时,例如:

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

XmlSerializer 将返回解析错误。发送所有参数都标有 namespace 或不带 namespace 的 XML 会很好——只要它们被一致地标记就没关系。

预先感谢您帮助我解决这个问题。

附加说明:该示例是为了简化附加代码而准备的,所以请不要在意 Profile 由两个相同类型的属性组成。

最佳答案

产生两个属性的原因是:

elementFormDefault="unqualified">  

这意味着不应限定 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>

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

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

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

关于从 XSD 生成的 C# 类包含标有不同限定属性的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44964018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com