2016-06-27 2 views
0

Мне нужно найти способ определения линий с использованием представления топологии. Теперь у меня есть что-то похожее на это:Как сделать топологию геометрии через XML и XSD?

<?xml version="1.0" encoding="UTF-8"?> 
<Root> 
    <Points> 
     <Point> 
      <UIDP>1</UIDP> 
      <X>5379847.689</X> 
      <Y>1223602.644</Y> 
      <MX>0.05</MX> 
      <MY>0.05</MY> 
     </Point> 
     <Point> 
      <UIDP>2</UIDP> 
      <X>5379828.473</X> 
      <Y>1223606.113</Y> 
      <MX>0.05</MX> 
      <MY>0.05</MY> 
     </Point> 
    </Points> 
    <Lines> 
     <Line> 
      <Point>1</Point>/> 
      <Point>2</Point>/> 
     </Line> 
    </Lines> 
</Root> 

Где Линия/точка является значением точки уникальным идентификатором (UIDP).

Вопросы

  1. Есть ли способ сделать это более ясно, получить не только ID, но отверстие определение точки с помощью ссылки или что-то подобное?
  2. Как сделать это с помощью XLink или XPointer?
  3. Как определить его в схеме XSD 1.1?
+0

Я был бы удивлен, если бы кто-то этого не делал раньше. Мне нравится использовать стандарты XML, когда я могу их найти, и они подходят. Если вы его найдете, вы должны найти библиотеки, а это значит, что вам будет меньше работать. – Kieveli

+0

Вы знакомы с '.NET'? На этой платформе есть класс DataSet, который позволяет вам определять отношения между «DataTables» так же, как это делается в базах данных: первичные ключи и внешние ключи. Он может автоматически генерировать схему xsd. Если вы хотите, я могу поместить сгенерированную схему. Просто укажите точные отношения между точками и линиями. –

+0

Нет, я не знаком с .NET, но было бы неплохо увидеть эту схему. –

ответ

0

Я не нашел, как это сделать, хотя XLink или XPointer, но uderstand, как определить часть правил с помощью XSD.

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1"> 

    <xsd:complexType name="point"> 
     <xsd:sequence> 
      <xsd:element name="UIDP" type="xsd:integer"/> 
      <xsd:element name="X" type="xsd:float"/> 
      <xsd:element name="Y" type="xsd:float"/> 
      <xsd:element name="MX" type="xsd:float"/> 
      <xsd:element name="MY" type="xsd:float"/> 
     </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="line"> 
     <xsd:sequence> 
      <xsd:element name="Point1" type="xsd:integer"/> 
      <xsd:element name="Point2" type="xsd:integer"/> 
     </xsd:sequence> 
     <xsd:assert test="Point1 != Point2"/> 
    </xsd:complexType> 

    <xsd:element name="Root"> 
     <xsd:complexType> 
      <xsd:sequence> 

       <xsd:element name="Points"> 
        <xsd:complexType> 
         <xsd:sequence> 
          <xsd:element name="Point" type="point" maxOccurs="unbounded"/> 
         </xsd:sequence> 
        </xsd:complexType> 
       </xsd:element> 

       <xsd:element name="Lines"> 
        <xsd:complexType> 
         <xsd:sequence> 
          <xsd:element name="Line" type="line" maxOccurs="unbounded"/>  
         </xsd:sequence> 
        </xsd:complexType> 

        <xsd:unique name="lines_unique"> 
         <xsd:selector xpath="Line"/> 
         <xsd:field xpath="Point1"/> 
         <xsd:field xpath="Point2"/> 
        </xsd:unique> 

       </xsd:element> 
      </xsd:sequence> 
     </xsd:complexType> 

     <xsd:key name="point_uidp"> 
      <xsd:selector xpath="Points/Point"></xsd:selector> 
      <xsd:field xpath="UIDP"></xsd:field> 
     </xsd:key> 

     <xsd:keyref refer="point_uidp" name="point_1"> 
      <xsd:selector xpath="Lines/Line/Point1"></xsd:selector> 
      <xsd:field xpath="."></xsd:field> 
     </xsd:keyref> 

     <xsd:keyref refer="point_uidp" name="point_2"> 
      <xsd:selector xpath="Lines/Line/Point2"></xsd:selector> 
      <xsd:field xpath="."></xsd:field> 
     </xsd:keyref> 

    </xsd:element> 

</xsd:schema> 

Правила, определенные по схеме:

  1. все точки идентификаторов должны быть уникальными, должны появиться и не может быть NULL
  2. все точки линии связи должны быть из диапазона точек идентификаторами
  3. точка линии связь должна быть уникальной и не может быть продублирована в другой линии
+0

Но одно правило не определено: последовательность [1, 0] совпадает с [0, 1] –

0

.NET DataSet класс AutoGenerate следующей схеме (я добавил пустые строки для ясности):

<?xml version="1.0" standalone="yes"?> 
<Root> 
    <xs:schema id="Root" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 

    <xs:element name="Root" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> 
     <xs:complexType> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 

      <xs:element name="Point"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element name="UIDP" type="xs:int" /> 
       <xs:element name="X" type="xs:double" minOccurs="0" /> 
       <xs:element name="Y" type="xs:double" minOccurs="0" /> 
       <xs:element name="MX" type="xs:double" minOccurs="0" /> 
       <xs:element name="MY" type="xs:double" minOccurs="0" /> 
       </xs:sequence> 
      </xs:complexType> 
      </xs:element> 

      <xs:element name="Line"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element name="Point1" type="xs:int" /> 
       <xs:element name="Point2" type="xs:int" /> 
       </xs:sequence> 
      </xs:complexType> 
      </xs:element> 

     </xs:choice> 
     </xs:complexType> 

     <xs:unique name="PK_Points" msdata:PrimaryKey="true"> 
     <xs:selector xpath=".//Point" /> 
     <xs:field xpath="UIDP" /> 
     </xs:unique> 

     <xs:unique name="PK_Lines" msdata:PrimaryKey="true"> 
     <xs:selector xpath=".//Line" /> 
     <xs:field xpath="Point1" /> 
     <xs:field xpath="Point2" /> 
     </xs:unique> 

     <xs:keyref name="FK_Lines2" refer="PK_Points" msdata:ConstraintOnly="true"> 
     <xs:selector xpath=".//Line" /> 
     <xs:field xpath="Point2" /> 
     </xs:keyref> 

     <xs:keyref name="FK_Lines1" refer="PK_Points" msdata:ConstraintOnly="true"> 
     <xs:selector xpath=".//Line" /> 
     <xs:field xpath="Point1" /> 
     </xs:keyref> 

    </xs:element> 
    </xs:schema> 

    <Point> 
    <UIDP>1</UIDP> 
    <X>5379847.689</X> 
    <Y>1223602.644</Y> 
    <MX>0.05</MX> 
    <MY>0.05</MY> 
    </Point> 
    <Point> 
    <UIDP>2</UIDP> 
    <X>5379828.473</X> 
    <Y>1223606.113</Y> 
    <MX>0.05</MX> 
    <MY>0.05</MY> 
    </Point> 

    <Line> 
    <Point1>1</Point1> 
    <Point2>2</Point2> 
    </Line> 
</Root> 

Схема генерируется в одном файле вместе с данными.

Обратите внимание на отсутствие Points и Lines элементов.

К сожалению, это схема версии 1.0. Поэтому более сложные проверки недоступны.

Атрибуты с префиксом msdata могут быть удалены.

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