Чтение XML, разное количество узлов - PullRequest
0 голосов
/ 26 апреля 2020

Когда я читаю файл XML в VB. NET (веб-сервис ASMX), в некоторых случаях может отсутствовать какой-либо узел. Мой код следующий:

nodetype = node("type").InnerText
nodetime = node("time").InnerText
nodefileName = node("fileName").InnerText

И я подумал об этом условии, чтобы увидеть, существует ли узел или нет. Если он не существует, он возвращает строку с 0.

If node("fileName")Is Nothing Then
  nodefileName = "0"
Else
  nodefileName = nodefileName = node("fileName").InnerText.
End If

Вместо того, чтобы выполнять проверку для всех узлов в отдельности ... как вы можете выполнить проверку для всех сразу, и если это не так? t существует в файле XML, положить 0 в соответствующую переменную? Спасибо 1000!

РЕДАКТИРОВАТЬ: XML образец, XML не всегда имеет все узлы.

<?xml version="1.0" encoding="UTF-8"?>
<eventLog>
    <event>
        <type>access1</type>
        <fileName>file.xml</fileName>
        <time>2020-04-25</time>
        <baseExtraData>
            <sample>Bone</sample>
            <age>65</age>
        </baseExtraData>
    </event>
    <event>
        <type>access2</type>
        <fileName>file2.xml</fileName>
        <time>2020-04-24</time>
        <baseExtraData>
            <sample>Malow</sample>
            <age>11</age>
        </baseExtraData>
    </event>
</eventLog>

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Ну, вот решение с одной вспомогательной функцией. В форму добавлена ​​кнопка «BtnImport» и текстовое поле с именем «Txt XML», в котором содержится путь к вашему xml файлу:

Imports System.IO
Imports System.Text
Imports System.Xml

Private Function GetNodeText(ByVal Dom As XmlDocument, ByVal Path As String) As String
    Dim Node As XmlNode = Dom.SelectSingleNode(Path)

    If Node Is Nothing Then Return vbNullString
    Return Node.InnerText
End Function

Private Sub BtnImport_Click(sender As Object, e As EventArgs) Handles BtnImport.Click
    Dim DOC As New XmlDocument
    Dim SB As New StringBuilder
    Dim Line(4) As String

    SB.Append("type;fileName;time;sample;age")
    SB.Append(vbCrLf)

    DOC.Load(TxtXML.Text)

    Dim Counter As Integer = 1
    Dim EventPath = String.Format("/descendant::event[{0}]", Counter)
    Do Until DOC.SelectSingleNode(EventPath) Is Nothing
        Line(0) = GetNodeText(DOC, EventPath & "/type")
        Line(1) = GetNodeText(DOC, EventPath & "/fileName")
        Line(2) = GetNodeText(DOC, EventPath & "/time")
        Line(3) = GetNodeText(DOC, EventPath & "/baseExtraData/sample")
        Line(4) = GetNodeText(DOC, EventPath & "/baseExtraData/age")

        SB.Append(Join(Line, ";"))
        SB.Append(vbCrLf)

        Counter += 1
        EventPath = String.Format("/descendant::event[{0}]", Counter)
    Loop

    Dim FS As New FileStream(TESTFOLDER & "\Test.csv", FileMode.Create)
    Dim SW As New StreamWriter(FS)

    SW.Write(SB.ToString)
    SW.Close()
End Sub
0 голосов
/ 26 апреля 2020

Использование Xml Linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            var events = doc.Descendants("event").Select(x => new {
                type = (string)x.Element("type"),
                filename = (string)x.Element("fileName"),
                time = (DateTime)x.Element("time")
            }).ToList();
        }
    }
}
...