VB анализирует XML с несколькими дочерними элементами, как мне убедиться, что я захватил все значения

Я работаю над тем, чтобы прочитать в XML-файле захват его элементов, выполнить любые преобразования/вычисления, которые необходимо выполнить для этого конкретного файла, а затем загрузить в базу данных SQL. прямо сейчас мне просто нужна помощь в том, как я буду анализировать и хранить все данные xml, чтобы я мог разместить их там, где они есть. Я все время путаюсь в том, как это сделать с этим форматом XML. Обычно я могу получить значения PList, Name, Desc, но не любое из значений, то, что я ищу, выглядит примерно так:

вывод: Plist, Name, Desc, Code, Price. Где Plist, Name, Desc останутся прежними, пока не будет найден следующий и так далее.

Пример XML

<?xml version = "1.0" encoding = "iso-8859-1" ?>
<CoatSchedules>
<Cot PList = "02" Name = "CDC" Desc = "PAR/PAV/EX3/RCH/EXP">
<Color Code = "ARC" Price = "39.58"/>
<Color Code = "BAR" Price = "39.58" **Default = "50.00"**/>
<Color Code = "BEP" Price = "58.54"/>
<Color Code = "BEX" Price = "51.54"/>
</Cot>
<Cot PList = "0A" Name = "E6C" Desc = "PAR/PAV" **Deduct = "2.00"**>
<Color Code = "BPA" Price = "24.00"/>
<Color Code = "BPV" Price = "24.00"/>
<Color Code = "COT" Price = "0.00"/>
<Color Code = "PAR" Price = "24.00"/>
<Color Code = "PAV" Price = "24.00"/>
<Color Code = "UTP" Price = "25.00"/>
<Color Code = "UTV" Price = "20.00"/>
<Color Code = "UV" Price = "6.72"/>
</Cot>
</CoatSchedules>

Обновлено: Default и Deduct добавлены для отображения «неизвестных» элементов, которых не следует ожидать, но мы хотим принять к сведению, что мы видели это в файле. Я пробовал XDocument, но я думаю, что для этого может потребоваться использовать XmlReader, так как эти файлы могут быть очень большими, и я читал, что ридер лучше подходит для этого.

For Each element As XElement In xd.Root.Elements("Cot")
            Console.WriteLine("PList: {0}; Name: {1}; Desc:{2}; Code: {3}; Price: {4}", CStr(element.Element("PList").Value), CStr(element.Element("Name")), CStr(element.Element("Desc")), CStr(element.Element("Code")), CStr(element.Element("Price")))
            Dim PListValue = element.Attribute("PList").Value
            Dim NameValue = element.Attribute("Name").Value
            Dim DescriptionValue = element.Attribute("Desc").Value
            Dim ColorCodeValue
            Dim PriceValue

            Console.WriteLine("PList: {0}; Name: {1}; Desc:{2};", PListValue, NameValue, DescriptionValue)

            For Each child As XElement In element.Elements("Color")
                Dim ColorCodeValue = child.Attribute("Code").Value
                Dim PriceValue = child.Attribute("Price").Value
                Console.WriteLine(" Code: {0}; Price: {1}", ColorCodeValue, PriceValue)
            Next
        Next

как мне захватить эти значения элементов/атрибутов только в переменные, чтобы я мог манипулировать и/или отправлять в базу данных SQL по мере необходимости?

РЕДАКТИРОВАТЬ2: Вот небольшая выборка большого XML, который мне нужно будет прочитать, насколько я могу судить, мне нужно будет использовать XMLReader и, возможно, даже LINQ, чтобы получить все данные из этого большого файла. пример для этого был бы очень признателен, а вы, ребята, потрясающие!

 <?xml version = "1.0" encoding = "iso-8859-1" ?>
<Styles>
<Material PList = "02" Code = "B53">
<Style Name = "ARRAY *" Fin = "S" Sph = "92.70" POW = "012" PRS = "001" BCV = "002"
 COL = "CLR" TNT = "002" COT = "R8C" EDG = "602" FRM = "001"/>
<Style Name = "ARRAY 2 *" Fin = "S" Sph = "92.70" POW = "012" PRS = "001" BCV = "002"
 COL = "CLR" TNT = "002" COT = "R8C" EDG = "602" FRM = "001"/>
<Style Name = "ARRAY 2 W *" Fin = "S" Sph = "92.70" POW = "012" PRS = "001" BCV = "002"
 COL = "CLR" TNT = "002" COT = "R8C" EDG = "602" FRM = "001"/>
<Style Name = "ARRAY W *" Fin = "S" Sph = "92.70" POW = "012" PRS = "001" BCV = "002"
 COL = "CLR" TNT = "002" COT = "R8C" EDG = "602" FRM = "001"/>
</Material>
<Material PList = "02" Code = "B67">
<Style Name = "ARRAY *" Fin = "S" Sph = "92.70" POW = "013" PRS = "001" BCV = "002"
 COL = "CLR" TNT = "002" COT = "R8C" EDG = "604" FRM = "001"/>
<Style Name = "ARRAY 2 *" Fin = "S" Sph = "92.70" POW = "013" PRS = "001" BCV = "002"
 COL = "CLR" TNT = "002" COT = "R8C" EDG = "604" FRM = "001"/>
<Style Name = "ARRAY 2 W *" Fin = "S" Sph = "92.70" POW = "013" PRS = "001" BCV = "002"
 COL = "CLR" TNT = "002" COT = "R8C" EDG = "604" FRM = "001"/>
<Style Name = "ARRAY W *" Fin = "S" Sph = "92.70" POW = "013" PRS = "001" BCV = "002"
 COL = "CLR" TNT = "002" COT = "R8C" EDG = "604" FRM = "001"/>
</Material>
.
.
.
</Material>
</Styles>

Огромные xml-файлы Я обычно использую комбинацию XmlReader и Xml Linq. См. мой образец C# здесь, где его можно легко преобразовать в VB.net: stackoverflow.com/questions/61607180/…

jdweng 11.04.2023 22:53

@jdweng я отредактировал (EDIT2) небольшую выборку большого файла, который я хотел бы получить, я проверил ваш ответ и думаю, что он сработает для меня, но у меня все еще есть проблемы со своевременным чтением этого файла, поэтому, если вы могли бы разъяснить это или использовать мой пример в качестве справочного материала, чтобы помочь мне понять, как я буду использовать xmlreader и linq. Спасибо!

Ledz3p 13.04.2023 19:21

материал - это XElement, как в вашем коде: для каждого стиля как XElement в material.Elements("Style")

jdweng 14.04.2023 04:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
70
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы могли бы, ИМХО, использовать XElement

    Dim xe As XElement
    ' xe = XElement.Load("path here")
    ' for testing use literal
    xe = <CoatSchedules>
             <Cot PList = "02" Name = "CDC" Desc = "PAR/PAV/EX3/RCH/EXP">
                 <Color Code = "ARC" Price = "39.58"/>
                 <Color Code = "BAR" Price = "39.58"/>
                 <Color Code = "BEP" Price = "58.54"/>
                 <Color Code = "BEX" Price = "51.54"/>
             </Cot>
             <Cot PList = "0A" Name = "E6C" Desc = "PAR/PAV">
                 <Color Code = "BPA" Price = "24.00"/>
                 <Color Code = "BPV" Price = "24.00"/>
                 <Color Code = "COT" Price = "0.00"/>
                 <Color Code = "PAR" Price = "24.00"/>
                 <Color Code = "PAV" Price = "24.00"/>
                 <Color Code = "UTP" Price = "25.00"/>
                 <Color Code = "UTV" Price = "20.00"/>
                 <Color Code = "UV" Price = "6.72"/>
             </Cot>
         </CoatSchedules>

    Dim errs As String = VerifyXML(xe) ' <<<<<< One change  <<<<<<<

    For Each cot As XElement In xe.<Cot>
        Dim PListValue As String = cot.@PList
        Dim NameValue As String = cot.@Name
        Dim DescriptionValue As String = cot.@Desc
        For Each clr As XElement In cot.<Color>
            Dim ColorCodeValue As String = clr.@Code
            Dim PriceValue As String = clr.@Price
            Stop ' for debug
        Next
    Next

Обновлено:

Проверьте XML. См. одно изменение в коде выше

Private Function VerifyXML(someXML As XElement) As String
    Dim sb As New System.Text.StringBuilder
    Dim attrs As List(Of XAttribute) = someXML.Attributes.ToList
    Select Case someXML.Name.LocalName
        Case "CoatSchedules"
        Case "Cot"
            ' PList = "" Name = "" Desc = ""
            For Each attr As XAttribute In attrs
                Select Case attr.Name
                    Case "PList", "Name", "Desc"
                    Case Else
                        sb.AppendFormat("Cot unknown attribute {0}", attr.Name)
                        sb.AppendLine()
                End Select
            Next
        Case "Color"
            ' Code = "" Price = ""
            For Each attr As XAttribute In attrs
                Select Case attr.Name
                    Case "Code", "Price"
                    Case Else
                        sb.AppendFormat("Color unknown attribute {0}", attr.Name)
                        sb.AppendLine()
                End Select
            Next
        Case Else
            sb.AppendFormat("Unknown element {0}", someXML.Name.LocalName)
            sb.AppendLine()
    End Select

    For Each el As XElement In someXML.Elements
        sb.Append(VerifyXML(el))
    Next
    Return sb.ToString
End Function

это здорово, и в основном то, что я ищу, есть ли способ с помощью этого фрагмента кода найти «неизвестные» элементы и зарегистрировать их, т.е. не знаю, каким будет имя элемента, просто это не один из Plist, Элементы Name, Desc, Color, Price и хотите принять это к сведению?

Ledz3p 11.04.2023 22:30

и я предполагаю, что второй вопрос о Xelement, один из XML-файлов, которые я буду получать, может иметь размер до 200 МБ, не развалится ли Xelement с таким большим XML-файлом? Спасибо за вашу помощь

Ledz3p 11.04.2023 22:32

@ Ledz3p - Вы имеете в виду элементы или атрибуты? 200 МБ потребуется немного для загрузки, но после этого все должно быть в порядке.

dbasnett 12.04.2023 15:11

может быть либо, я полагаю, поэтому мне нужно будет захватить либо, если они неизвестны

Ledz3p 12.04.2023 16:26

@ Ledz3p - отредактируйте свой исходный пост, чтобы он содержал те вещи, которые «неизвестны».

dbasnett 12.04.2023 17:38

я добавил их в свои правки

Ledz3p 12.04.2023 21:33

@ Ledz3p - добавлена ​​проверка. Рекурсивный метод, возвращающий строку ошибок.

dbasnett 13.04.2023 16:26

Извините, у меня нет кода, которым я могу поделиться.

В прошлом мой подход заключался в предварительном разборе XML-документов на пары ключ-значение, где ключ — это XPATH-адрес узла, а значение — содержимое узла (если оно есть). Я думаю, что использовал рекурсивный алгоритм для построения XPATH на основе обхода System.Xml.XmlNode детей.

Это позволяет использовать простой линейный алгоритм синтаксического анализа на основе XPATH и может обрабатывать нераспознанные узлы.

Ответ принят как подходящий

Попробуйте подписаться

Imports System.Xml
Imports System.Xml.Linq

Module Module1
    Const FILENAME As String = "c:\temp\test.xml"
    Sub Main()
        Dim reader As XmlReader = XmlReader.Create(FILENAME)
        While (Not reader.EOF)
            If (reader.Name <> "Material") Then
                reader.ReadToFollowing("Material")
            End If
            If (Not reader.EOF) Then
                Dim material As XElement = XElement.ReadFrom(reader)
                Dim plist As String = material.Attribute("PList").Value
                Dim code As String = material.Attribute("Code").Value
                Console.WriteLine("Material = {0}, Code = {1}", plist, code)
            End If
        End While
        Console.ReadLine()
    End Sub

End Module

мне нравится это, это коротко, мило и по существу, но после получения значений PList и кода материала, как вы показали выше, как мне получить каждый стиль, который находится в этом материале, прежде чем переходить к следующему материалу? Извините, все еще выясняю эту вещь XML

Ledz3p 13.04.2023 22:32

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