Я работаю над тем, чтобы прочитать в 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>
@jdweng я отредактировал (EDIT2) небольшую выборку большого файла, который я хотел бы получить, я проверил ваш ответ и думаю, что он сработает для меня, но у меня все еще есть проблемы со своевременным чтением этого файла, поэтому, если вы могли бы разъяснить это или использовать мой пример в качестве справочного материала, чтобы помочь мне понять, как я буду использовать xmlreader и linq. Спасибо!
материал - это XElement, как в вашем коде: для каждого стиля как XElement в material.Elements("Style")
Вы могли бы, ИМХО, использовать 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 и хотите принять это к сведению?
и я предполагаю, что второй вопрос о Xelement, один из XML-файлов, которые я буду получать, может иметь размер до 200 МБ, не развалится ли Xelement с таким большим XML-файлом? Спасибо за вашу помощь
@ Ledz3p - Вы имеете в виду элементы или атрибуты? 200 МБ потребуется немного для загрузки, но после этого все должно быть в порядке.
может быть либо, я полагаю, поэтому мне нужно будет захватить либо, если они неизвестны
@ Ledz3p - отредактируйте свой исходный пост, чтобы он содержал те вещи, которые «неизвестны».
я добавил их в свои правки
@ Ledz3p - добавлена проверка. Рекурсивный метод, возвращающий строку ошибок.
Извините, у меня нет кода, которым я могу поделиться.
В прошлом мой подход заключался в предварительном разборе 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
Огромные xml-файлы Я обычно использую комбинацию XmlReader и Xml Linq. См. мой образец C# здесь, где его можно легко преобразовать в VB.net: stackoverflow.com/questions/61607180/…