Читать XML и хранить в переменных ASMX, VB.NET - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь прочитать файл XML с моего сервера и записать значения в текстовый файл через запятую. Вы можете помочь мне? Это веб-сервис (ASMX) на Windows Server 2012 R2.

Я перепробовал много альтернатив, но ни одна из них не работает, я не могу записать в файл TXT. Может ли что-то происходить на уровне конфигурации или ...?

Заранее большое спасибо!

<?xml version="1.0" encoding="UTF-8"?>
<eventLog>
<event>
    <type>access1</type>
        <baseExtraData>
        <sample>Bone</sample>
        <age>65</age>
    </baseExtraData>
</event>
<event>
    <type>access2</type>
    <baseExtraData>
        <sample>Malow</sample>
        <age>11</age>
    </baseExtraData>
</event>
</eventLog>
<%@ WebService Language="VB" Class="WSIn" %>

Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Data
Imports System.IO
Imports System.Xml

...

Dim doc As XmlDocument = New XmlDocument()
doc.Load("C:\inetpub\wwwroot\web\e2b59263af68.xml")
Dim root As XmlNode = doc.DocumentElement

??? ...

Ответы [ 2 ]

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

Хорошо, вот еще один, который, возможно, лучше соответствует вашим потребностям:

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

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(2) As String

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

    DOC.Load(TxtXML.Text)
    Dim ElemList As XmlNodeList = DOC.DocumentElement.GetElementsByTagName("event")
    For Each Item As XmlNode In ElemList
        Line(0) = Item.ChildNodes(0).InnerText
        Line(1) = Item.ChildNodes(1).ChildNodes(0).InnerText
        Line(2) = Item.ChildNodes(1).ChildNodes(1).InnerText
        SB.Append(Join(Line, ";"))
        SB.Append(vbCrLf)
    Next

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

    SW.Write(SB.ToString)
    SW.Close()
End Sub

Как вы видите, я построил некоторую форму, которая имеет текстовое поле Txt XML, которое содержит путь вашего XML файл и кнопка с именем BtnImport, которая запускает действие. Строка (0) содержит тип, Строка (1) образец и Строка (2) возраст. Я проверил этот, и он отлично работает.

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

Если ваша цель состоит в том, чтобы получить эти данные в CSV-файл, тогда я бы go передал DataTable. Сначала прочитайте ваш XML в DataTable, затем экспортируйте его в файл CSV. Ваш XML файл очень близок к структуре, которую можно легко импортировать в DataTable. Требуемая структура выглядит следующим образом:

<root>
    <record>
        <field1>Some Data</field1>
        <field2>Some other Data</field2>
        <field3>42</field3>
        ...
    </record>
    <record>
        <field1>...</field1>
        <field2>...</field2>
        <field3>...</field3>
        ...
    </record>
</root>

Так что вам следует избавиться от ненужного тега «baseExtraData». Если вы можете повлиять на создание xml, очень хорошо. Иначе, некоторые XSLT должны делать эту работу. Поместите это в файл с именем вроде «removebaseExtraData.xslt»:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <!-- Standard copy template: for all node where's no other rule: copy as they are -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <!-- The node will be deleted and the included nodes drawn one level upwards -->
    <xsl:template match="baseExtraData">
        <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>

А вот функция для выполнения XSLT:

Imports System.IO
Imports System.Xml

Public Sub XSLTTransform(ByVal XMLFile As String,
                         ByVal StylesheetFile As String,
                         Optional ByVal ResultFile As String = vbNullString)
    Dim XSLT As New Xsl.XslCompiledTransform(True)
    Dim SelfTransform As Boolean = (ResultFile = vbNullString)

    ' Load style sheet
    Try
        XSLT.Load(StylesheetFile)
    Catch ex As Exception
        Debug.Print(ex.Source & ": " & ex.Message)
        Exit Sub
    End Try

    ' Do the transform.
    Try
        If SelfTransform Then ResultFile = Path.GetTempFileName
        XSLT.Transform(XMLFile, ResultFile)
        If SelfTransform Then
            File.Delete(XMLFile)
            File.Move(ResultFile, XMLFile)
        End If
    Catch ex As Exception
        Debug.Print(ex.Source & ": " & ex.Message)
    End Try
End Sub

Теперь у вас должно быть что-то вроде этого :

<?xml version="1.0" encoding="UTF-8"?>
<eventLog>
<event>
    <type>access1</type>
    <sample>Bone</sample>
    <age>65</age>
</event>
<event>
    <type>access2</type>
    <sample>Malow</sample>
    <age>11</age>
</event>
</eventLog> 

Следующий шаг прост:

Imports System.Xml

Dim XmlFile As XmlReader = XmlReader.Create(MyWorkfile, New XmlReaderSettings())
Dim DS As New DataSet

DS.ReadXml(XmlFile)
XmlFile.Close()
Dim MyDataTable As DataTable = DS.Tables(0)

Здесь MyWorkfile - это путь к вашему (пока что измененному) файлу XML, а MyDataTable - это ваша DataTable. Теперь это должно быть легко экспортировано в CSV. Я еще не сделал этого, поэтому я не могу дать вам один из моих проверенных кодов. Но в net есть множество решений для решения этой задачи, возможно, одна из этих ссылок может помочь (я гуглил «vb. net datatable to csv»):

DataTable to File

Наиболее эффективный способ преобразования таблицы данных в CSV (C#)

http://www.devx.com/vb2themax/Tip/19703

...