Каждой твари по... схеме

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Каждой твари по... схеме

Сообщение MIT » 03.12.2008 (Ср) 14:34

Есть, значит, у меня вот такой вот интересный XML файл

Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<DataSet xmlns="http://www.site.ru/qwertyasd">
  <xs:schema id="ItemDetailData" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="ItemDetailData" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
      <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="ItemDetail">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="ID" type="xs:decimal" minOccurs="0" />
                <xs:element name="Name" type="xs:string" minOccurs="0" />
                <xs:element name="OtherName" type="xs:string" minOccurs="0" />
                <xs:element name="Author" type="xs:string" minOccurs="0" />
                <xs:element name="Annotation" type="xs:string" minOccurs="0" />
                <xs:element name="Picture" type="xs:string" minOccurs="0" />
                <xs:element name="Url" type="xs:string" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:choice>
      </xs:complexType>
    </xs:element>
  </xs:schema>
  <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
    <ItemDetailData xmlns="">
      <ItemDetail diffgr:id="ItemDetail1" msdata:rowOrder="0">
        <ID>123</ID>
        <Name>SuperMegaItem`sName</Name>
        <OtherName>xpeH BaM</OtherName>
        <Author />
        <Annotation>SuperMegaItem`sName descripton about blah blah blah</Annotation>
        <Picture>http://www.site.ru/qwertyasd/megapic.gif</Picture>
        <Url>http://www.site.ru/qwertyasd/123</Url>
      </ItemDetail>
    </ItemDetailData>
  </diffgr:diffgram>
</DataSet>


Подскажите, как его правильно обрабатывать? Мне, в итоге, надо получить данные ID, Name etc, но что делать со схемой? Какие она дает приемущества или накладывает ограничения, что с ней вообще-то люди делают?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

773FF
Обычный пользователь
Обычный пользователь
 
Сообщения: 86
Зарегистрирован: 07.02.2008 (Чт) 10:51

Re: Каждой твари по... схеме

Сообщение 773FF » 03.12.2008 (Ср) 21:33

Я конечно могу ошибаться, но этот XML-документ можно читать как таблицу.
Однажды делал это примерно так:
Код: Выделить всё
Imports System.Xml

Dim dsDataSet As System.Data.DataSet
Dim xmlDoc As XmlDataDocument

'Добавляем таблицу в DataSet
        dsDataSet.Tables.Add(dtTable)

'Создаём поля (столбцы) таблицы. Какие стобцы есть в таблице можно узнать, если открыть XML-документ в Excel
        dtTable.Columns.Add("FileNumber", Type.GetType("System.Int64"))
        dtTable.Columns.Add("FileName", Type.GetType("System.String"))
        'и т. д.

'Обьявляем новый XML документ
xmlDoc = New XmlDataDocument(dsDataSet)
'Загружаем dsDataSet из XML файла
xmlDoc.Load(My.Application.Info.DirectoryPath & "\FileXML.xml")


Dim dvDataView As New DataView(dtTable)


'Читаем
   FileName = (dvDataView(i)("FileName"))'Где i - номер строки. Можно читать до "упора" (Do While Not EOF)  и прибавлять i=i+1

773FF
Обычный пользователь
Обычный пользователь
 
Сообщения: 86
Зарегистрирован: 07.02.2008 (Чт) 10:51

Re: Каждой твари по... схеме

Сообщение 773FF » 03.12.2008 (Ср) 21:48

P. S.: схема
Вложения
CXEMA.jpg
CXEMA.jpg (26.83 Кб) Просмотров: 781

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Каждой твари по... схеме

Сообщение MIT » 03.12.2008 (Ср) 22:22

Интересный подход... Буду разбираться.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Каждой твари по... схеме

Сообщение MIT » 05.12.2008 (Пт) 23:18

Наконец-то дошли руки до разборки вышеописанного примера. Так вот - что-то не работает. Немного дописал код (ошибок много было...)

Получилос это:
Код: Выделить всё
        Dim dsDataSet As New System.Data.DataSet
        Dim xmlDoc As XmlDataDocument
        Dim dtTable As New Data.DataTable
        'Добавляем таблицу в DataSet
        dsDataSet.Tables.Add(dtTable)

        'Создаём поля (столбцы) таблицы. Какие стобцы есть в таблице можно узнать, если открыть XML-документ в Excel
        dtTable.Columns.Add("FileNumber", Type.GetType("System.Int64"))
        dtTable.Columns.Add("FileName", Type.GetType("System.String"))
        'и т. д.

        'Обьявляем новый XML документ
        xmlDoc = New XmlDataDocument(dsDataSet)
        'Загружаем dsDataSet из XML файла
        xmlDoc.Load("C:\detail(4003591).txt")


        Dim dvDataView As New DataView(dtTable)


        'Читаем
        Dim FileName As String, i As Integer

        Do
            i += 1
            FileName = (dvDataView(i)("FileName")) 'Где i - номер строки. Можно читать до "упора" (Do While Not EOF)  и прибавлять i=i+1
        Loop
но в цикле немного не работает; можно поподробнее?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

773FF
Обычный пользователь
Обычный пользователь
 
Сообщения: 86
Зарегистрирован: 07.02.2008 (Чт) 10:51

Re: Каждой твари по... схеме

Сообщение 773FF » 11.12.2008 (Чт) 22:25

Читать в цикле так:
Код: Выделить всё
For i = 0 To dvDataView.Count - 1

Next i

И-нет глючит, не успевая исправить сообщение и страница перезагружается.

773FF
Обычный пользователь
Обычный пользователь
 
Сообщения: 86
Зарегистрирован: 07.02.2008 (Чт) 10:51

Re: Каждой твари по... схеме

Сообщение 773FF » 11.12.2008 (Чт) 22:45

Исправил:
У меня таблица сначала создавалась, записывалась в XML:

Код: Выделить всё
'добавляю строку
                    workRow = dtTable.NewRow()
                    workRow("FileNumber") = NumFiles : NumFiles = NumFiles + 1
                    workRow("FileFullName") = FileFullName1
                    workRow("FileName") = files(i).Name
                    workRow("FileExtension") = files(i).Extension
                    workRow("FileLastWriteTime") = files(i).LastWriteTime
                    workRow("FileLastAccessTime") = files(i).LastAccessTime
                    workRow("FileCreationTime") = files(i).CreationTime
                    workRow("FileLength") = fileInfo1.Length

                    dtTable.Rows.Add(workRow)
                    ...

'Обьявляем новый XML документ
               xmlDoc = New XmlDataDocument(dsDataSet)

        'Сохраняем DataSet в XML
        xmlDoc.Save(My.Application.Info.DirectoryPath & "\FileDataBase.xml").


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

По адресу http://www.java2s.com/Code/VB/XML/Loadx ... ataSet.htm есть пример, но у твоего файла сложная схема, может и не прокатить.
Есть ещё не совсем правильное решение: читать с 10-й по 15-ю строки этот XML как обычный текстовый файл. Mid-ом вырезать нужный кусок строки и отбрасывать последние три символа " />"

Читать так:
Код: Выделить всё
Dim Bufer As String = ""
FileOpen(1, My.Application.Info.DirectoryPath & "\XML.XML", OpenMode.Input)
Do While Not EOF(1)

'читаем ненужные строки                 
For z As integer = 1 To 9
                  Bufer = LineInput(1)
Next z

'читаем нужные строки и обрезаем, затем пропускаем ненужные и начинаем всё снова
Loop
FileClose(1)

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Каждой твари по... схеме

Сообщение MIT » 12.12.2008 (Пт) 22:39

773FF, спасибо!
Данная тобой статья навела меня на мысль, что все это намного проще, чем я себе представлял.
Очень хорошо работает так: ДатаСет.Таблица(0).Строка(0)
и дальше доступ к ячейкам по имени или индексу.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Shurrik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 110
Зарегистрирован: 20.05.2004 (Чт) 5:35
Откуда: Керчь, Крым

Re: Каждой твари по... схеме

Сообщение Shurrik » 13.12.2008 (Сб) 6:44

Может я чего-то не понимаю, но всегда делаю так
Код: Выделить всё
        Dim ds As New DataSet
        ds.ReadXml("c:\0.xml")
        ' MsgBox(ds.Tables(0).Rows.Count, MsgBoxStyle.Information)
и вся информация о базе становится доступна.
Колесо: Хочешь жить? Умей вертеться.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 61

    TopList