Я новичок в 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";
}
}