Как определить «литерал» в XSD - PullRequest
0 голосов
/ 08 декабря 2011

Я новичок в XSD и в значительной степени остроумие.

Мне нужно как-то определить буквальный элемент в файле XSD, чтобы пользователи могли использовать его в XML-документе..

Например: в документе XML я хочу позволить пользователю иметь возможность добавлять такой элемент:

  <WordBoundary/>

, но пусть файл XSD определяет не только имя 'WordBoundary ', а также список элементов в , которые относятся к типам, определенным в других местах XSD.

Возможно ли это?

Обновлен, чтобы предоставить дополнительную информацию:

Я пытаюсь написать XSD (или набор XSD), которые предоставляют библиотеку предопределенных элементов для использования конечным пользователем.Элементы в конечном итоге будут использоваться для генерации регулярных выражений, но я хочу скрыть от пользователей сложности регулярных выражений, насколько это возможно.XSD будет использовать .NET XSD.Exe для генерации классов C #.

В настоящее время я определил такие элементы, как и и т. Д., Которые работают нормально, но полагаются на то, что их конечный шаблон регулярного выражения определен в коде.Некоторые элементы имеют атрибут Pattern, позволяющий выполнить точную настройку, но это несколько загромождает XML-документ для пользователей.Примеры встроенных существующих определений C #:

const string BidMatch = @"(?<" + BidGroupName + ">" + DecimalNumberFragment + ")";
const string OfferMatch = @"(?<" + OfferGroupName + ">" + DecimalNumberFragment + ")";

const string BidOfferSpreadMatch = BidMatch + OptionalGap + RangeSeparatorFragment + OptionalGap + OfferMatch;

Поэтому я хотел иметь возможность реорганизовать это так, чтобы все шаблоны регулярных выражений были перемещены из кода в определения XSD, чтобы сформировать библиотеку (или, если она станетневозможно, чтобы XML-файл просматривался по имени), в результате чего существуют примитивы, такие как и и обычно используемые, но более сложные структуры, такие как и т. д.

Таким образом, при использовании могут использоваться предопределенные элементы, такие как непосредственно в их XMLдокумента, но также может создавать свои собственные, как это:

<Group captureName="MyCustomMatch">
  <WordBoundary/>
        <Digit/>
        <Literal pattern="[xyz]" />
        <AnyOf/>
            <AnyOfChoice>
                <DecimalNumber />
                <Gap />
                <DecimalNumber />
            </AnyOfChoice>
            <AnyOfChoice>
                <LiteralText text="(" />
                <DecimalNumber />
                <LiteralText text=")" />
            </AnyOfChoice>
  <WordBoundary/>
</Group>

(На самом деле предопределенные элементы в библиотеке будут создаваться так же)

С точки кодавид, у меня в настоящее время есть AnyOf / Group и т. д., работающий, просматривая тип элемента и вызывая метод для генерации шаблона.Чтобы это работало, все эти новые элементы должны иметь общего предка, например RegexLiteral, из которого я могу просто прочитать атрибут Pattern или что-то еще и добавить его в полный шаблон.

Я попытался расширить общийвведите и попытайтесь переопределить его атрибут Pattern, чтобы использовать фиксированный атрибут, но XSD явно не позволяет этого.

Я надеюсь, что это всего лишь ограничение моих знаний по XSD, а не самого XSD, и надеюсь, что вы, умные ребята, знаетеспособ достижения этого.

Обновление 2: думал, что у меня это с этим фрагментом XSD

<xs:complexType name="LiteralFragment" abstract="true">
    <xs:attribute name="Pattern" type="xs:string" />
</xs:complexType>

<xs:complexType name="Fred">
    <xs:complexContent >
        <xs:extension base="LiteralFragment" >
            <xs:attribute name="Pattern" type="xs:string" fixed="BBB" />
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

, но XSD (и Xsd2Code в этом отношении) генерирует этот мусорный код:

public partial class Fred : LiteralFragment
{

    private string pattern1Field;

    public Fred()
    {
        this.pattern1Field = "BBB";
    }

    [System.Xml.Serialization.XmlAttributeAttribute("Pattern")]
    public string Pattern1
    {
        get { return this.pattern1Field; }
        set { this.pattern1Field = value; }
    }
}

, какие бомбы, потому что используются два XmlAttributeAttribute с «Pattern».Мне нужен генератор XSD, который достаточно умен, чтобы понять это и сгенерировать вместо этого код:

public partial class Fred : LiteralFragment
{
    public Fred()
    {
        Pattern = "BBB";
    }
}

1 Ответ

0 голосов
/ 09 декабря 2011

Попробуйте это ....

XSD:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="root" type="TRoot"/>

    <xsd:element name="WordBoundary">
        <xsd:complexType/>
    </xsd:element>

    <xsd:element name="SomethingElse">
        <xsd:complexType mixed="true">
            <xsd:sequence>
                <xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

    <xsd:complexType name="TRoot">
        <xsd:sequence>
            <xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

И этот XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <SomethingElse>Text <WordBoundary/> another <WordBoundary/>...</SomethingElse>
</root>

Это то, что вы имели в виду?

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