Создайте XSD, который поддерживает что-то вроде преобразований web.config или мультитенантов / файлов конфигурации xml - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть 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 выглядел что-то вроде следующего, чтобы учесть «переопределения среды» (атрибут E в элементе env: *):

<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 так, чтобы при условии EVERY элемент в моей конфигурации, я хочу опционально иметь env:* его версию. Нужно ли создавать новый файл схемы, как показано ниже, который в основном дублирует оригинал, за исключением целевого пространства имен?

<?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>

1 Ответ

0 голосов
/ 03 мая 2020

Есть ли способ изменить XSD так, чтобы, учитывая КАЖДЫЙ элемент в моей конфигурации, я по желанию мог иметь его версию env: *.

Нет, элегантного способа добавить после каждого элемента необязательный элемент с тем же именем, но другим пространством имен. Вам нужно было бы добавить каждый такой элемент env: * по отдельности.

Нужно ли создавать новый файл схемы, как показано ниже, который по сути является дубликатом оригинала, за исключением целевого пространства имен?

Да, но только если вы придерживаетесь этого плана использования другого пространства имен для элементов 'extension'. В своем ответе на мой комментарий вы сказали:

Я подумал, что мне понадобятся отдельные пространства имен. Я не хотел менять код везде, где выбираются элементы. Например, SiteConfig.Elements ("SiteSettings") .Elements ("AWSGroup") .FirstOrDefault (); Продолжил бы работать без подбора элементов env: *. Затем во время процесса публикации sh я бы везде поменял свойства env: *, и код просто работал бы. Что вы предлагаете?

Я едва написал строку C#, но согласно https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.firstordefault?view=netcore-3.1 метод FirstOrDefault () возвращает первый элемент в последовательности или по умолчанию. Поэтому я думаю, что есть гораздо более простой подход, который не сломает существующий код ...

Для каждого элемента, который должен иметь элемент (ы) расширения опции:

  1. Установить maxOccurs = "неограниченный" (или "2", если вы хотите разрешить только один элемент расширения)
  2. Добавьте атрибут "E" и сделайте его необязательным (чтобы существующие документы, в которых он пропущен при первом появлении, все еще допустимо).

Имя «E» для атрибута не является идеальным - я бы выбрал что-то более описательное, если это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...