如何在xsd中将自定义属性添加到ComplexType元素?

时间:2019-05-09 00:53:10

标签: c# xml xsd

我正在从提供给我的XSD生成c#类文件。如果仅使用原始的本机XSD,我就能做到这一点而没有问题。但是,我想通过添加我自己的命名空间来修改XSD,并且我想通过生成器提供新修改的XSD,以生成一个包含我提供的类定义以及我添加的定义的类文件。

所以我的理解是,我需要添加一个名称空间以及该名称空间下的新属性。我确实具有访问权限,并且能够修改原始XSD或添加自己的XSD。

我看了这篇与Extend XSD with custom attributes?类似的帖子

下面是我尝试的一个示例。在尝试中,我试图在“ mns”命名空间下的DeviceInfo元素中添加属性“ Humidity”。当前,这表明“在此上下文中不支持'mns:attribute'元素。”

test.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
       targetNamespace="http://MyNamespace.com"
       elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="DeviceInfo">
        <xs:complexType>
            <xs:attribute name="Humidity" type="xs:float" />
        </xs:complexType>
    </xs:element>
</xs:schema>

main.xsd

<xs:schema targetNamespace="http://www.CIP4.org/JDFSchema_2_0"
       xmlns="http://www.CIP4.org/JDFSchema_2_0"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mns="http://MyNamespace.com"
       xsi:schemaLocation="http://MyNamespace.com ./test.xsd"
       elementFormDefault="qualified"
       attributeFormDefault="unqualified">
<xs:element name="DeviceInfo">
    <xs:complexType>
        <xs:sequence>
            <xs:element maxOccurs="unbounded" minOccurs="0" ref="Activity"/>
            <xs:element maxOccurs="2" minOccurs="0" ref="FileSpec"/>
            <xs:element maxOccurs="unbounded" minOccurs="0" ref="JobPhase"/>
        </xs:sequence>
        <xs:attribute name="CounterUnit" type="NMTOKEN" use="optional"/>
        <mns:Humidity value="0"/>
</xs:schema>

当前,此上下文不支持返回“ mns:湿度”元素。

有人可以解释如何将其插入复杂类型吗?

我还尝试将mns:Humidity放置在与deviceInfo相同的标签中

<xs:element name="DeviceInfo mns:Humidity="0">

通过类生成器发送了两个单独的“ DeviceInfo”实例,其中第二个实例附加了一个1。

如何将其插入带有名称空间的complexType中?

1 个答案:

答案 0 :(得分:0)

在main.xsd中的DeviceInfo声明中,添加

<xs:attribute ref="mns:Humidity"/>

加上“ mns”的名称空间声明和带有xs:import的该名称空间的schemaLocation="test.xsd"声明。

test.xsd中包含单个声明

<xs:attribute name="Humidity" type="xs:float"/>

您尝试解决的问题表明您正在使用试错法,而不是实际阅读XSD中的结构实际含义。那不是前进的好方法。您似乎对这些概念感到困惑,例如,架构永远不应包含xsi:schemaLocation属性。