VB.Net Загрузка простого XML-файла в DataTable

У меня возникли проблемы с тем, чтобы vb.net загрузил XML-файл в таблицу данных для использования в представлении данных и других текстовых элементах. Я попробовал большинство решений, которые смог найти за последние два дня поиска, но, похоже, ничего не работает. Насколько я могу судить, это должна быть простая команда DataSource.ReadXML, но когда я это делаю, а затем устанавливаю источник данных DataGridVew1, ничего не появляется. Я пробовал несколько комбинаций чтения DataTable и DataSource, но не смог заставить ни одну из них работать.

Я не уверен, какой здесь правильный подход. Должен ли я использовать ReadXML в DataSet или DataTable? Если я прочитаю DataSet, как данные попадут в правильную таблицу? Сейчас я работаю только с одной таблицей, но как только я это выясню, мне нужно будет прочитать данные из нескольких разных XML-файлов и поместить их в разные DataTables.

Вот образец XML-файла, который я использую. Я сократил его, поскольку в документе около 100 записей. Этот XML-файл был создан в Excel, чтобы сэкономить время на вводе всего:

<?xml version = "1.0" encoding = "utf-8" ?>
<BlankData  xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance">
    <record>
        <SizeNum>#1 - 45</SizeNum>
        <Height>8</Height>
        <Top>3</Top>
        <Bottom>7.75</Bottom>
        <Weight>0</Weight>
        <TrimmedWeight>0</TrimmedWeight>
        <Wrap>false</Wrap>
    </record>
    <record>
        <SizeNum>#1 - 90</SizeNum>
        <Height>8</Height>
        <Top>1.75</Top>
        <Bottom>11.25</Bottom>
        <Weight>0</Weight>
        <TrimmedWeight>0</TrimmedWeight>
        <Wrap>false</Wrap>
    </record>
    <record>
        <SizeNum>#10 - 45 </SizeNum>
        <Height>20</Height>
        <Top>4.875</Top>
        <Bottom>16.75</Bottom>
        <Weight>0</Weight>
        <TrimmedWeight>0</TrimmedWeight>
        <Wrap>false</Wrap>
    </record>
    <record>
        <SizeNum>#10 - 90 </SizeNum>
        <Height>14</Height>
        <Top>1.125</Top>
        <Bottom>19.5</Bottom>
        <Weight>0</Weight>
        <TrimmedWeight>0</TrimmedWeight>
        <Wrap>false</Wrap>
    </record>
    <record>
        <SizeNum>#11 - 45 </SizeNum>
        <Height>23</Height>
        <Top>6</Top>
        <Bottom>21.375</Bottom>
        <Weight>0</Weight>
        <TrimmedWeight>0</TrimmedWeight>
        <Wrap>false</Wrap>
    </record>
</BlankData>

Я добавил этот XML-файл в проект, добавив новый элемент XML-файла и назвав его BlankData. Существует также источник данных под названием PressData с таблицей под названием BlankData, которая имеет 7 столбцов с именами, которые соответствуют приведенному выше образцу XML. Не уверен, правильно ли иметь одно и то же имя файла ml и таблицы данных. До этой итерации у меня было другое имя для файла xml и имени таблицы, но я не смог заставить его работать, поэтому решил попробовать дать им одно и то же имя.

Я устал загружать XML в источник данных с помощью приведенного ниже кода.

PressData.ReadXml(My.Application.Info.DirectoryPath & "\BlankData.xml")
DataGridView1.DataSource = PressData

в результате появляется пустое поле datagridview

и устал загружать XML в таблицу данных внутри источника данных с помощью этого кода

PressData.BlankData.ReadXml(My.Application.Info.DirectoryPath & "\BlankData.xml")
DataGridView1.DataSource = PressData.BlankData

в результате чего в datagridview отображаются 7 столбцов, но нет данных строк.

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

Возможно ли, что у меня проблема с XML-файлом?

Спасибо за помощь!

Дариан

Лучший способ отладки проблем с десериализацией (т. е. чтением) XML — это его сериализация (т. е. запись в файл). Существует множество способов работы с XML. Начните с создания тестовых данных и используйте их для создания XML-файла. Вам следует использовать метод, аналогичный тому, который вы планируете использовать для десериализации данных.

user246821 02.04.2024 20:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
144
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вот пример. Сначала ваши данные.

    Dim xe As XElement
    xe = <BlankData xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance">
             <record>
                 <SizeNum>#1 - 45</SizeNum>
                 <Height>8</Height>
                 <Top>3</Top>
                 <Bottom>7.75</Bottom>
                 <Weight>0</Weight>
                 <TrimmedWeight>0</TrimmedWeight>
                 <Wrap>false</Wrap>
             </record>
             <record>
                 <SizeNum>#1 - 90</SizeNum>
                 <Height>8</Height>
                 <Top>1.75</Top>
                 <Bottom>11.25</Bottom>
                 <Weight>0</Weight>
                 <TrimmedWeight>0</TrimmedWeight>
                 <Wrap>false</Wrap>
             </record>
             <record>
                 <SizeNum>#10 - 45 </SizeNum>
                 <Height>20</Height>
                 <Top>4.875</Top>
                 <Bottom>16.75</Bottom>
                 <Weight>0</Weight>
                 <TrimmedWeight>0</TrimmedWeight>
                 <Wrap>false</Wrap>
             </record>
             <record>
                 <SizeNum>#10 - 90 </SizeNum>
                 <Height>14</Height>
                 <Top>1.125</Top>
                 <Bottom>19.5</Bottom>
                 <Weight>0</Weight>
                 <TrimmedWeight>0</TrimmedWeight>
                 <Wrap>false</Wrap>
             </record>
             <record>
                 <SizeNum>#11 - 45 </SizeNum>
                 <Height>23</Height>
                 <Top>6</Top>
                 <Bottom>21.375</Bottom>
                 <Weight>0</Weight>
                 <TrimmedWeight>0</TrimmedWeight>
                 <Wrap>false</Wrap>
             </record>
         </BlankData>

Затем создайте набор данных и прочитайте XML. Нет имени таблицы.

    Dim ds As New DataSet()
    ds.ReadXml(xe.CreateReader)
    Debug.WriteLine(ds.Tables(0).TableName) '<<<<<<<<<<<<<<<<<<<<<<<

Затем назначьте единственную таблицу в DataGridView.

    DataGridView1.DataSource = ds.Tables(0)

Обновлено:

для загрузки из файла вместо литерала.

    Dim xe As XElement
    Dim URI As String = "????????????"

    xe = XElement.Load(URI)

Спасибо за ваш ответ. В нашем приведенном выше примере элемент x создает XML-файл?

Daryan 02.04.2024 21:48

@Дарян - нет. Смотрите редактирование.

dbasnett 02.04.2024 21:56
Ответ принят как подходящий

Чтобы загрузить данные XML, вы должны использовать набор данных, а не таблицу данных.

Когда XML-файл считывается, набор данных (который представляет собой набор таблиц) загружает данные в первую таблицу набора данных.

Итак, я только что вставил ваши данные в тестовый текстовый файл.

Следовательно, этот код:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim sFile As String =
        "c:\test\test2\data.txt"

    Dim dt As New DataSet
    dt.ReadXml(sFile)

    DataGridView1.DataSource = dt.Tables(0)


End Sub

И результат такой:

Итак, использование набора данных работает нормально. Вместо таблицы данных требуется набор данных, поскольку импорт XML может привести к созданию нескольких таблиц.

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

Спасибо за ваш ответ! Теперь я заставил его работать, используя набор данных. Я думаю, что моя проблема заключалась в ссылке на источник данных GridView. В вашем примере вы используете «0», который, как я полагаю, является первой таблицей, я только что протестировал, используя DataGridView1.DataSource = dt.Tables («запись»), и это тоже сработало. Итак, если я хочу загрузить в набор данных несколько таблиц, буду ли я включать каждую таблицу в xml с уникальным дочерним элементом, затем читать XML, как показано выше, а затем использовать данные с именем или соответствующим номером?

Daryan 02.04.2024 21:47

Контекстные «несколько» наборов данных предполагают ОДИН XML-файл. Если вам нужно загружать данный XML-файл снова и снова, используйте метод ReadXML снова и снова для каждого нового отдельного XML-файла. Функция «несколько» таблиц предназначена для одного XML-файла, который «может» содержать несколько таблиц в данных XML. Итак, концепция здесь заключается в том, что некоторый файл данных XML вполне может представлять более одной таблицы. Скажем, XML-файл как один счет-фактура. В этих данных счета-фактуры в формате XML у вас могут быть имя, адрес, платежная информация (одна таблица), а также повторяющиеся строки данных (другая таблица). Итак, чтобы загрузить один XML-файл, вы каждый раз используете Readxml.

Albert D. Kallal 02.04.2024 22:19

Если в xml уже есть несколько таблиц (а не просто повторяющиеся строки в одной таблице, как в вашем примере), то один Readxml создаст несколько таблиц. Здесь нет «концепции» или функции, которая намекала бы или предполагала, что если у вас есть несколько XML-файлов, вы попытаетесь загрузить их все в один набор данных. Если это отдельные XML-файлы, вы каждый раз используете новый ReadXML. Если у вас есть несколько файлов XML одной и той же таблицы, вам нужно использовать чтение XML, сохранить/отправить данные в таблицу, а затем прочитать XML следующего файла.

Albert D. Kallal 02.04.2024 22:27

Спасибо, Альберт, это имеет гораздо больше смысла!

Daryan 03.04.2024 18:20

Другие вопросы по теме