Donguy1976 Ответов: 2

Отображение XSD в БД через C#


Привет,

У меня есть XML-файл, как показано ниже.

<HouseInfo>
    <HouseNumber>1</HouseNumber>
    <HouseLog>
        <RoomInfo>
            <RoomNumber>1</RoomNumber>
            <Timestamp>2017-12-29T12:16:51</Timestamp>
            <Furnitures>
                <Table>
                    <Color>Blue</Color>
                    <Height>23</Height>
                </Table>
            </Furnitures>
            <ToolCounts>
                <Scope>1</Scope>
            </ToolCounts>
        </RoomInfo>

        <RoomInfo>
            <RoomNumber>2</RoomNumber>
            <Timestamp>2017-12-29T15:43:23</Timestamp>
            <Furnitures>
                <Table>
                    <Color>Black</Color>
                    <Height>35.2</Height>
                </Table>
            </Furnitures>
            <ToolCounts>
                <Scope>1</Scope>
            </ToolCounts>
            <Bathroom>
                <Code>1234</Code>
                <Faucets>3></Faucets>
            </Bathroom>
        </RoomInfo>

        <RoomInfo>
            <RoomNumber>2</RoomNumber>
            <Timestamp>2017-12-29T15:45:48</Timestamp>
            <Furnitures>
                <Table>
                    <Color>Red</Color>
                    <Height>98.56</Height>
                </Table>
            </Furnitures>
            <ToolCounts>
                <Scope>1</Scope>
            </ToolCounts>
            <Bathroom>
                <Code>1234</Code>
                <Faucets>2></Faucets>
            </Bathroom>
        </RoomInfo>
    </HouseLog>
</HouseInfo>



Я создал файл XML-схемы, как показано ниже.

<pre lang="HTML">
<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid Technologies Online Tools 1.0 (https://www.liquid-technologies.com) -->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="HouseInfo">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="HouseNumber" type="xs:unsignedByte" />
        <xs:element name="HouseLog">
          <xs:complexType>
            <xs:sequence>
              <xs:element maxOccurs="unbounded" name="RoomInfo">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="RoomNumber" type="xs:unsignedByte" />
                    <xs:element name="Timestamp" type="xs:dateTime" />
                    <xs:element name="Furnitures">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="Table">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element name="Color" type="xs:string" />
                                <xs:element name="Height" type="xs:decimal" />
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="ToolCounts">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="Scope" type="xs:unsignedByte" />
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                    <xs:element minOccurs="0" name="Bathroom">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="Code" type="xs:unsignedShort" />
                          <xs:element name="Faucets" type="xs:string" />
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>


После создания XSD - файла я использовал XSD2DB.exe чтобы создать все таблицы в MS SQL Server.

У меня есть приложение на C#, и в этом SQLXMLBulkLoad библиотека используется для загрузки XML-содержимого в БД. Я передаю XSD и XML в качестве параметров функции Execute. Теперь я получаю ниже ошибки.

relationship expected on 'HouseLog'.


Что я уже пробовал:

Я попробовал добавить
sql:is-constant="1"
к HouseLog и некоторые другие теги, и это удаляет вышеуказанную ошибку, но вызывает еще одну ошибку, говоря, что он не может найти конкретные столбцы в БД, даже если они существуют.

Поэтому я думаю, что проблема в том, что мне нужно правильно определить отношения в XSD, и я понятия не имею, как это сделать. Надеюсь, кто-нибудь сможет предложить какие-то решения.

Пожалуйста, дайте мне несколько примеров, так как я совершенно новичок в этой схеме для разговора с БД и у меня закончились идеи. Заранее спасибо.

2 Ответов

Рейтинг:
2

Dirk Bahle

Я не уверен, что у вас есть реальная проблема, потому что образцы XML/XSD достаточно длинные, чтобы наблюдать за крошечными проблемами, но вы должны:

1> убедитесь, что ваше сообщение об ошибке содержит номер строки и столбец, чтобы лучше видеть, где находится проблема. Пример для этого здесь используется DataContractSerializer но объект error должен быть похож на другие синтаксические анализаторы Xml:

См. текст и проект в разделе '

Making Things Bullet Proof
' раздел:
Чтение и запись XML в C#/VB.Net[^]


2> Если вы не можете использовать этот более "детальный подход" или все еще не можете найти проблему, вы также можете создать версии XML/XSD, которые содержат только часть данных (например: только HouseInfo, HouseNumber, Houselog), оставляя все остальное ниже Houselog.

Если это не сработает, попробуйте оставить Houselog и посмотреть, работает ли он сейчас, если он работает, добавьте больше деталей, чтобы увидеть, сломается ли он сейчас.

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

3> Кроме того, очевидно, полезно посмотреть на некоторые ссылки XSD или учебные пособия:
Ссылка на XML-схему[^]

Ссылка на XML-схемы (XSD) [^]


Мне интересно, нужно ли вам указывать, что HouseLog может происходить более одного раза <pre>maxOccurs="unbounded" name="HouseLog"</pre> но я не совсем уверен (это просто ощущение...)


Donguy1976

Я думаю, что лучше всего было бы начать с меньшего XML-файла.

<houseinfo>
<housenumber>1
<houselog>
<roominfo>
<номер комнаты>1
<timestamp>2017-12-29T12:16:51




Итак, для приведенного выше XML, не могли бы вы помочь мне написать XSD, а также скрипт БД, который будет генерировать необходимые таблицы в БД? Спасибо!

Рейтинг:
1

Dirk Bahle

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

Редактирование XSD в VS-это кусок пирога, так как вы получаете эти приятные всплывающие предложения, показывающие вам некоторые параметры, которые вы, возможно, пропустили в XSD, надеюсь, это поможет...