创建一个XSD,支持类似web.config变换或多租户配置xml文件的东西

问题描述 投票:0回答:1

我有一个Xml文件是这样的。

<Configuration xmlns="http://schemas.benefittech.com/evolution/site">
    <SiteSettings>
        <ProfileGroup>TBOLoanPmtElection</ProfileGroup>
        <AWSGroup>TBOLoanPmtElection_Admin</AWSGroup>
    </SiteSettings>
</Configuration>

我有一个XSD文件是这样的:

<?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属性)。

<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:* 的版本。 我是否要做一个新的schema文件,就像下面这样,除了目标命名空间之外,基本上是原版的复制?

<?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>
xsd multi-tenant
1个回答
0
投票

有没有办法修改XSD,使我的配置中的每一个元素都能有一个可选的env:*版本。

没有,没有一种优雅的方法可以在每个元素后添加一个具有相同名称但不同命名空间的可选元素。你需要单独添加每个这样的env:*元素。

我是否需要制作一个新的模式文件,就像下面这样,除了目标名称空间之外,基本上是原始文件的复制?

是的,但前提是你必须坚持为 "extension "元素使用不同的命名空间。在你对我的评论的回复中,你说

我以为我需要单独的命名空间。我不想到处改变选择元素的代码。例如,SiteConfig.Elements( "SiteSettings").Elements( "AWSGroup").FirstOrDefault();会继续工作,而不需要拾取env:*元素。然后在发布过程中,我会把各地的env:*属性换掉,代码就能正常工作了。你有什么建议?

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

在每个需要有选项扩展元素的元素上。

  1. 设置maxOccurs="unbounded" (或者 "2",如果你只想允许一个扩展元素)
  2. 增加属性 "E",并使之成为可选的属性(这样,第一次出现时省略该属性的现有文件仍然有效)。

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

© www.soinside.com 2019 - 2024. All rights reserved.