0

Я искал и искал, но не мог найти ничего, даже отдаленно напоминающего ответ.Отображение 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; 
     } 
    } 
} 

ответ

0

Ну, Оскар и другие, которые могли бы быть заинтересованы в чем-то подобном, мне потребовалось 12 дней, но в конце концов я все понял и это работает. Требуется несколько секунд (возможно, 2), чтобы создать сопоставления, базу данных и заполнить их данными из xml, но затем она работает красиво. Все еще не уверены, как сопоставить типы IDREF с реальными идентификаторами, но это незначительная проблема по сравнению с тем, что я пережил последние несколько дней.

0

Я запутался - это, кажется, вы противоречите сам. В какой-то момент вы указываете «как хранить эти XML-документы через NHibernate в РСУБД?«Затем немного позже вы спрашиваете:« Существует ли даже такая вещь, как «драйвер XML-документа» для NHibernate, чтобы она не могла входить в СУБД, но оставалась как XML-документ в файловой системе? », Который кажется точным противоположный первому вопросу

В любом случае - NHibernate - это среда для сопоставления между объектной моделью и системой реляционных баз данных, которая может быть запрошена с использованием SQL. Если вы обнаружите СУБД, которая использует XML-файл для хранения данных и выявления факел SQL для этих файлов, возможно, вы могли бы написать для него драйвер NHibernate, но сам NHibernate, конечно, не содержит ничего похожего на механизм запросов, предназначенный для XML-файлов.

Что касается сопоставления этого с СУБД с NHibernate, я подозреваю, что ваш Лучше всего было бы написать что-то, что сгенерировало конфигурацию отображения для NHibernate. Либо путем преобразования в конфигурацию XML NHibernate, либо путем испускания кода для Mapping-By-Code или FluentNHibernate.

+0

Я забыл сказать: «В случае, если такая вещь невозможна, тогда ...» – pele

+0

Отредактировано и добавлено «В случае, если такое невозможно, тогда», надеюсь, вы одобряете редактирование? – pele

 Смежные вопросы

  • Нет связанных вопросов^_^