Я искал и искал, но не мог найти ничего, даже отдаленно напоминающего ответ.Отображение NHibernate из документа dtd или xsd или даже самого документа xml
У меня есть DTD (xml-dtd) для типа документа XML (мой тип документа, ничто не связано с NHibernate), и я хотел бы сохранить все документы этого типа документа в реляционную модель. Нет, я не хочу хранить сам XML-файл в базе данных как нечто вроде поля varchar или XML или чего-то еще, что побеждает цель - я хочу вместо этого разбить ее на свои элементы и атрибуты и сохранить THAT вместо этого, как правильная реляционная модель. И XML поддерживает это.
Я могу, в visual studio 2015, создать XSD из данного DTD, а затем с помощью этого XSD создать классы C#, которые отражают данный XSD (и расширением оригинального DTD). Документы анализируются, и все в порядке.
Теперь вопрос заключается в том, как хранить эти XML-документы через NHibernate в RDBMS без (большого количества) ручного кодирования, в котором все отношения присутствуют как таковые? Должен быть простой способ, используя функции автоматического сопоставления, но есть некоторые «ограничения» исходного DTD (некоторые вещи IDREF и т. Д., Реляционные материалы), которые я бы хотел «преобразовать» в отношения «на лету» и иметь правильные отношения к другим классам, а не сохранение «кода» в качестве значения типа string.
Так в основном, мне нужен NHibernate & & XML & & DTD & & XSD гуру в то же самое время, чтобы пролить некоторый свет на это может быть легко достигнуто. Я был на 100% уверен, что такие вещи были «нормальными» с hibernate и nhibernate в течение последних 10-15 лет, по крайней мере (и я никогда не пробовал, кажется, первый раз, когда мне нужно хранить XML-документы в разбивке по базе данных к их составляющим битам, а не в целом).
В случае, если такая вещь невозможна, существует ли даже такая вещь, как «драйвер XML-документа» для NHibernate, так что ей не нужно входить в СУБД, но оставаться в качестве документа XML в файловой системе?
Пример (для гуру SGML/XML там смотрят IDREF и NMTOKEN, почему они «просто», а не правильные отношения с тем, куда они должны идти, то есть другой класс или использование или вариант или что-то еще?): Конечный результат:
Я ожидаю Ссылка быть «Класс» с «кодом» (или идентификатор) сам (G117 как в public virtual Class Reference { get; set; }
Фактический результат: «код» просто строка со значением «G117 ", как указано в
[System.Xml.Serialization.XmlAttributeAttribute(DataType="NMTOKEN")]
public string code {
get {
return this.codeField;
}
set {
this.codeField = value;
}
}
XML файл:
<Class code="G117" kind="process">
<SuperClass code="G"/>
<Rubric id="13-223" kind="preferred">
<Label xml:lang="en">A preferred label</Label>
</Rubric>
<Rubric id="13-224" kind="shortTitle">
<Label xml:lang="en">Short title</Label>
</Rubric>
<Rubric id="13-225" kind="exclusion">
<Label xml:lang="en">There is some exclusion text with a reference here <Reference>G12</Reference></Label>
</Rubric>
<Rubric id="13-226" kind="criteria">
<Label xml:lang="en">Some criteria text goes here</Label>
</Rubric>
</Class>
<Rubric id="56-327" kind="exclusion">
<Label xml:lang="en">This is some thext that might refer someplace <Reference>G117</Reference>; and another piece of text that refers to another place <Reference>BF9</Reference>; Another text describing something and there might be a reference from this piece of text somewhere else too <Reference>AB7</Reference></Label>
</Rubric>
DTD:
<!ELEMENT Class (Meta*,SuperClass*,SubClass*,ModifiedBy*,ExcludeModifier*,Rubric*,History*)>
<!ATTLIST Class code NMTOKEN #REQUIRED kind IDREF #REQUIRED usage IDREF #IMPLIED variants IDREFS #IMPLIED>
<!ELEMENT Rubric (Label+,History*)>
<!ATTLIST Rubric id ID #IMPLIED kind IDREF #REQUIRED usage IDREF #IMPLIED>
<!ELEMENT Reference (#PCDATA)>
<!ATTLIST Reference classCode CDATA #IMPLIED authority NMTOKEN #IMPLIED uid NMTOKEN #IMPLIED code NMTOKEN #IMPLIED usage IDREF #IMPLIED variants IDREFS #IMPLIED>
Результирующая XSD:
<xs:element name="Class">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="Meta" />
<xs:element minOccurs="0" maxOccurs="unbounded" ref="SuperClass" />
<xs:element minOccurs="0" maxOccurs="unbounded" ref="SubClass" />
<xs:element minOccurs="0" maxOccurs="unbounded" ref="ModifiedBy" />
<xs:element minOccurs="0" maxOccurs="unbounded" ref="ExcludeModifier" />
<xs:element minOccurs="0" maxOccurs="unbounded" ref="Rubric" />
<xs:element minOccurs="0" maxOccurs="unbounded" ref="History" />
</xs:sequence>
<xs:attribute name="code" type="xs:NMTOKEN" use="required" />
<xs:attribute name="kind" type="xs:IDREF" use="required" />
<xs:attribute name="usage" type="xs:IDREF" />
<xs:attribute name="variants" type="xs:IDREFS" />
</xs:complexType>
</xs:element>
<xs:element name="Rubric">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="unbounded" ref="Label" />
<xs:element minOccurs="0" maxOccurs="unbounded" ref="History" />
</xs:sequence>
<xs:attribute name="id" type="xs:ID" />
<xs:attribute name="kind" type="xs:IDREF" use="required" />
<xs:attribute name="usage" type="xs:IDREF" />
</xs:complexType>
</xs:element>
<xs:element name="Reference">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="classCode" type="xs:string" />
<xs:attribute name="authority" type="xs:NMTOKEN" />
<xs:attribute name="uid" type="xs:NMTOKEN" />
<xs:attribute name="code" type="xs:NMTOKEN" />
<xs:attribute name="usage" type="xs:IDREF" />
<xs:attribute name="variants" type="xs:IDREFS" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
Сформированные C# классы
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/MyStuff")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/MyStuff", IsNullable=false)]
public partial class Class {
private Meta[] metaField;
private SuperClass[] superClassField;
private SubClass[] subClassField;
private ModifiedBy[] modifiedByField;
private ExcludeModifier[] excludeModifierField;
private Rubric[] rubricField;
private History[] historyField;
private string codeField;
private string kindField;
private string usageField;
private string variantsField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("Meta")]
public Meta[] Meta {
get {
return this.metaField;
}
set {
this.metaField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("SuperClass")]
public SuperClass[] SuperClass {
get {
return this.superClassField;
}
set {
this.superClassField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("SubClass")]
public SubClass[] SubClass {
get {
return this.subClassField;
}
set {
this.subClassField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("ModifiedBy")]
public ModifiedBy[] ModifiedBy {
get {
return this.modifiedByField;
}
set {
this.modifiedByField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("ExcludeModifier")]
public ExcludeModifier[] ExcludeModifier {
get {
return this.excludeModifierField;
}
set {
this.excludeModifierField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("Rubric")]
public Rubric[] Rubric {
get {
return this.rubricField;
}
set {
this.rubricField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("History")]
public History[] History {
get {
return this.historyField;
}
set {
this.historyField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="NMTOKEN")]
public string code {
get {
return this.codeField;
}
set {
this.codeField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="IDREF")]
public string kind {
get {
return this.kindField;
}
set {
this.kindField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="IDREF")]
public string usage {
get {
return this.usageField;
}
set {
this.usageField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="IDREFS")]
public string variants {
get {
return this.variantsField;
}
set {
this.variantsField = value;
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/MyStuff")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/MyStuff", IsNullable=false)]
public partial class Rubric {
private Label[] labelField;
private History[] historyField;
private string idField;
private string kindField;
private string usageField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("Label")]
public Label[] Label {
get {
return this.labelField;
}
set {
this.labelField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("History")]
public History[] History {
get {
return this.historyField;
}
set {
this.historyField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="ID")]
public string id {
get {
return this.idField;
}
set {
this.idField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="IDREF")]
public string kind {
get {
return this.kindField;
}
set {
this.kindField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="IDREF")]
public string usage {
get {
return this.usageField;
}
set {
this.usageField = value;
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/MyStuff")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://tempuri.org/MyStuff", IsNullable=false)]
public partial class Reference {
private string classCodeField;
private string authorityField;
private string uidField;
private string codeField;
private string usageField;
private string variantsField;
private string valueField;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string classCode {
get {
return this.classCodeField;
}
set {
this.classCodeField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="NMTOKEN")]
public string authority {
get {
return this.authorityField;
}
set {
this.authorityField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="NMTOKEN")]
public string uid {
get {
return this.uidField;
}
set {
this.uidField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="NMTOKEN")]
public string code {
get {
return this.codeField;
}
set {
this.codeField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="IDREF")]
public string usage {
get {
return this.usageField;
}
set {
this.usageField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="IDREFS")]
public string variants {
get {
return this.variantsField;
}
set {
this.variantsField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTextAttribute()]
public string Value {
get {
return this.valueField;
}
set {
this.valueField = value;
}
}
}
Я забыл сказать: «В случае, если такая вещь невозможна, тогда ...» – pele
Отредактировано и добавлено «В случае, если такое невозможно, тогда», надеюсь, вы одобряете редактирование? – pele