首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建支持类似web.config转换或多租户/配置xml文件的XSD。

创建支持类似web.config转换或多租户/配置xml文件的XSD。
EN

Stack Overflow用户
提问于 2020-04-30 17:07:43
回答 1查看 24关注 0票数 0

我有这样一个Xml文件:

代码语言:javascript
复制
<Configuration xmlns="http://schemas.benefittech.com/evolution/site">
    <SiteSettings>
        <ProfileGroup>TBOLoanPmtElection</ProfileGroup>
        <AWSGroup>TBOLoanPmtElection_Admin</AWSGroup>
    </SiteSettings>
</Configuration>

我有一个这样的XSD文件:

代码语言:javascript
复制
<?xml version="1.0" encoding="us-ascii" ?>
<xs:schema elementFormDefault="qualified" attributeFormDefault="unqualified" version="5.0"
    xmlns="http://schemas.benefittech.com/evolution/site" targetNamespace="http://schemas.benefittech.com/evolution/site"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:vs="http://schemas.benefittech.com/Visual-Studio-Intellisense" vs:friendlyname="Evolution Site Configuration">

    <xs:element name="Configuration">
        <xs:complexType>
            <xs:all>
                <xs:element name="SiteSettings" minOccurs="0" maxOccurs="1">
                    <xs:complexType>
                        <xs:all>
                            <xs:element name="AWSGroup" type="xs:string" minOccurs="0" maxOccurs="1"/>
                            <xs:element name="ProfileGroup" type="xs:string" minOccurs="0" maxOccurs="1"/>
                            <xs:element name="LogActivityGroup" type="xs:string" minOccurs="0" maxOccurs="1"/>
                        </xs:all>
                    </xs:complexType>
                </xs:element>
            </xs:all>
        </xs:complexType>
    </xs:element>
</xs:schema>

我希望使我的Xml看起来类似于下面的内容,以允许‘环境重写’( env:*元素上的E属性):

代码语言:javascript
复制
<Configuration xmlns="http://schemas.benefittech.com/evolution/site" xmlns:env="http://schemas.benefittech.com/evolution/siteenvironment">
    <SiteSettings>
        <ProfileGroup>TBOLoanPmtElection</ProfileGroup>
        <AWSGroup>TBOLoanPmtElection_Admin</AWSGroup>
        <env:AWSGroup E="SecondEnvironment">TBOLoanPmtElection2_Admin</env:AWSGroup>
    </SiteSettings>
</Configuration>

是否有一种方法可以修改XSD,以便给定配置中的每个元素,我也希望有一个env:*版本的XSD。我是否必须像下面这样创建一个新的模式文件,除了目标名称空间之外,它基本上是原始模式的副本?

代码语言:javascript
复制
<?xml version="1.0" encoding="us-ascii" ?>
<xs:schema elementFormDefault="qualified" attributeFormDefault="unqualified" version="5.0"
    xmlns="http://schemas.benefittech.com/evolution/siteenvironment" targetNamespace="http://schemas.benefittech.com/evolution/siteenvironment"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:vs="http://schemas.benefittech.com/Visual-Studio-Intellisense" vs:friendlyname="Evolution Site Configuration">

    <xs:element name="Configuration">
        <xs:complexType>
            <xs:all>
                <xs:element name="SiteSettings" minOccurs="0" maxOccurs="1">
                    <xs:complexType>
                        <xs:all>
                            <xs:element name="AWSGroup" type="xs:string" minOccurs="0" maxOccurs="1">
                                <xs:complexType>
                                    <xs:attribute name="E" use="required" type="xs:string"/>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="ProfileGroup" type="xs:string" minOccurs="0" maxOccurs="1">
                                <xs:complexType>
                                    <xs:attribute name="E" use="required" type="xs:string"/>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="LogActivityGroup" type="xs:string" minOccurs="0" maxOccurs="1">
                                <xs:complexType>
                                    <xs:attribute name="E" use="required" type="xs:string"/>
                                </xs:complexType>
                            </xs:element>
                        </xs:all>
                    </xs:complexType>
                </xs:element>
            </xs:all>
        </xs:complexType>
    </xs:element>
</xs:schema>
EN

回答 1

Stack Overflow用户

发布于 2020-05-03 19:39:30

是否有一种方法来修改XSD,以便给出我配置中的每个元素,我想要它的env:*版本。

不,没有优雅的方法在每个元素之后添加一个可选元素,该元素具有相同的名称,但具有不同的命名空间。您需要分别添加每个这样的env:*元素。

,我是否必须像下面这样创建一个新的模式文件,除了目标名称空间之外,它基本上是原始模式的副本?

是的,但前提是您必须坚持对“扩展”元素使用不同的命名空间的计划。你在回答我的评论时说

,我想我需要单独的名称空间。我不想在所有选择元素的地方更改代码。例如,SiteConfig.Elements( "SiteSettings“).Elements( "AWSGroup”).FirstOrDefault();将继续工作,而不提取env:*元素。然后,在发布过程中,我会在任何地方交换env:*属性,代码就可以正常工作了。你的建议呢?

我几乎没有写过一行C#,但是根据https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.firstordefault?view=netcore-3.1,FirstOrDefault()方法返回序列中的第一个元素或默认值。所以我认为有一种更简单的方法不会破坏现有的代码.

对于每个需要有选项扩展元素的元素:

  1. Set maxOccurs=“un界”(或"2",如果您只想允许一个扩展元素),则
  2. 添加属性"E“并使其成为可选的(因此在第一次出现时忽略它的现有文档仍然有效)。

该属性的名称"E“并不理想--如果可能的话,我会选择更具有描述性的内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61528959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档