У меня возникли проблемы с тем, чтобы 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-файлом?
Спасибо за помощь!
Дариан





Вот пример. Сначала ваши данные.
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-файл?
@Дарян - нет. Смотрите редактирование.
Чтобы загрузить данные 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, как показано выше, а затем использовать данные с именем или соответствующим номером?
Контекстные «несколько» наборов данных предполагают ОДИН XML-файл. Если вам нужно загружать данный XML-файл снова и снова, используйте метод ReadXML снова и снова для каждого нового отдельного XML-файла. Функция «несколько» таблиц предназначена для одного XML-файла, который «может» содержать несколько таблиц в данных XML. Итак, концепция здесь заключается в том, что некоторый файл данных XML вполне может представлять более одной таблицы. Скажем, XML-файл как один счет-фактура. В этих данных счета-фактуры в формате XML у вас могут быть имя, адрес, платежная информация (одна таблица), а также повторяющиеся строки данных (другая таблица). Итак, чтобы загрузить один XML-файл, вы каждый раз используете Readxml.
Если в xml уже есть несколько таблиц (а не просто повторяющиеся строки в одной таблице, как в вашем примере), то один Readxml создаст несколько таблиц. Здесь нет «концепции» или функции, которая намекала бы или предполагала, что если у вас есть несколько XML-файлов, вы попытаетесь загрузить их все в один набор данных. Если это отдельные XML-файлы, вы каждый раз используете новый ReadXML. Если у вас есть несколько файлов XML одной и той же таблицы, вам нужно использовать чтение XML, сохранить/отправить данные в таблицу, а затем прочитать XML следующего файла.
Спасибо, Альберт, это имеет гораздо больше смысла!
Лучший способ отладки проблем с десериализацией (т. е. чтением) XML — это его сериализация (т. е. запись в файл). Существует множество способов работы с XML. Начните с создания тестовых данных и используйте их для создания XML-файла. Вам следует использовать метод, аналогичный тому, который вы планируете использовать для десериализации данных.