簡體   English   中英

如何通過使用XElement解析使用VB.NET讀取xml文件?

[英]How to read xml file using VB.NET by using XElement parsing?

我是解析xml的新手。 我嘗試了為類似問題提供的解決方案,但是我使用的XML格式不同。 我有一個來自外部工具的xml文件,如下所示。 我是從該工具獲得的Web響應。

<Entities TotalResults="2">
  <Entity Type="release">
    <Fields>
      <Field Name="name">
        <Value>Release1</Value>
      </Field>
      <Field Name="end-date">
        <Value>2015-05-15</Value>
      </Field>
      <Field Name="req-count">
        <Value>29</Value>
      </Field>
      <Field Name="usedPlans">
        <Value>Plan1</Value>
        <Value>Plan2</Value>
      </Field>      
    </Fields>
    <RelatedEntities />
  </Entity>
  <Entity Type="release">
    <Fields>
      <Field Name="name">
        <Value>Release2</Value>
      </Field>
      <Field Name="end-date">
        <Value>2015-05-15</Value>
      </Field>
      <Field Name="req-count">
        <Value>10</Value>
      </Field>
      <Field Name="usedPlans">
        <Value>Plan5</Value>
        <Value>Plan6</Value>
      </Field>      
    </Fields>
    <RelatedEntities />
  </Entity>
</Entities>

我需要獲得以下詳細信息:發布名稱,結束日期,需求數量,UsedPlans等

第一個版本的示例輸出為

Release Name: Release1
End Date: 2015-05-15
Req Count: 29
Used Plans: Plan1, Plan2

VB.NET代碼:

Public Function getReleaseInfo(cookie As String, domain As String, project As String) As RestResponse
    Dim resp As New relResponse()

    Try
        Dim relStartDate As String = ConfigurationManager.AppSettings("RelStartDate").Trim()
        Dim url = (Convert.ToString((Convert.ToString((Convert.ToString(RestUrl + "/rest/domains/") & domain) + "/projects/") & project) + "/releases?query={start-date[>='") & relStartDate) + "'] }"
        Dim request As WebRequest = WebRequest.Create(url)
        request.Headers.Set(HttpRequestHeader.Cookie, cookie)
        Dim result As WebResponse = request.GetResponse()

        Dim responseStream = result.GetResponseStream()
        If responseStream IsNot Nothing Then
            Dim reader = New StreamReader(responseStream)
            Dim output As String = reader.ReadToEnd()
            Dim xml = XElement.Parse(output)

            'below part gives me req-count but is there a better way. 
            'If I do as below, I have to do this for all items that I need

            Dim reqCount = From r In releaseXML...<Field> Where r@.FirstAttribute = "req-count" Select counReq = r.Value

            For Each req In reqCount
                Console.WriteLine(req)
            Next


        End If
    Catch ex As Exception
        resp.Good= False
        resp.Error= ex
    End Try

    Return resp
End Function


Dim reqCount = From r In releaseXML...<Field> Where r@.FirstAttribute = "req-count" Select counReq = r.Value

For Each req In reqCount
    Console.WriteLine(req)
Next

發出作為控制台

29
10

有什么更好的方法嗎?

我有以下代碼使用C#進行linq查詢,並且工作正常。 不幸的是,我無法將其轉換為vb.net,我嘗試了許多轉換器,但它們無法為我提供正確的vb.net查詢版本。 我不擅長糾正它。 有人可以為我轉換代碼。

工作的C#代碼:

string output = reader.ReadToEnd();
var xml = XElement.Parse(output);
var entities = xml.Descendants("Entity");
var releases = (
                from entity in entities
                select entity.Descendants("Field")
                    into fields
                    select fields as IList<XElement> ?? fields.ToList()
                        into xElements
                        let name = xElements.Single(x => x.Attribute("Name").Value == "name").Value
                        let endDate = xElements.Single(x => x.Attribute("Name").Value == "end-date").Value
                        let reqCount = xElements.Single(x => x.Attribute("Name").Value == "req-count").Value                                    
                        let PlansUsed = xElements.Single(x => x.Attribute("Name").Value == "usedPlans").Value                                                                    
                        select new Release { Name = name, EndDate = endDate, ReqCount = reqCount, PlansUsed = usedPlans }).ToList();

編輯:為linq查詢添加了有效的C#代碼。 有人可以將其轉換為vb.net。 注意:在線轉換器和其他工具未提供有效的轉換后代碼。

謝謝大家的幫助。 我設法解決了我的問題。 這是起作用的代碼

Public Function getReleaseInfo(cookie As String, domain As String, project As String) As RestResponse
    Dim resp As New relResponse()

    Try
        Dim url = "http://resturl"
        Dim request As WebRequest = WebRequest.Create(url)
        request.Headers.Set(HttpRequestHeader.Cookie, cookie)
        Dim result As WebResponse = request.GetResponse()

        Dim responseStream = result.GetResponseStream()
        If responseStream IsNot Nothing Then
            Dim reader = New StreamReader(responseStream)
            Dim output As String = reader.ReadToEnd()
            Dim xml = XElement.Parse(output)

             Dim releaseInformation = (From e As XElement In xml.Elements
                                          Let relName = e...<Field>.Single(Function(x) x.Attribute("Name").Value = "name").Value
                                          Let relEndDate = e...<Field>.Single(Function(x) x.Attribute("Name").Value = "end-date").Value
                                          Let relReqCount = e...<Field>.Single(Function(x) x.Attribute("Name").Value = "req-count").Value
                                          Let relUsedPlans = e...<Field>.Single(Function(x) x.Attribute("Name").Value = "usedPlans").Elements.ToList
                                          Select New myReleases With {.relName = relName, .relEndDate = relEndDate, .relReqCount = relReqCount, .relUsedPlans = relUsedPlans}).ToList

                resp.Good = True
                resp.result = releaseInformation

        End If
    Catch ex As Exception
        resp.Good= False
        resp.Error= ex
    End Try

    Return resp
End Function

myReleases class

Public Class myReleases
    Public relName As String
    Public relEndDate As Date
    Public relReqCount As Integer
    Public relUsedPlans As List(Of XElement)
    Public ReadOnly Property usedPlans As List(Of String)
        Get
            Dim plans As List(Of String) = (From p In RelUsedPlans Where Trim(p.Value) <> "" Select p.Value).ToList()
            Return plans                
        End Get
    End Property
End Class

Edit: Changed code to return used plans as a list of values

嘗試這樣的事情。...此代碼從文件“ xml.xml”中讀取XML到字符串中,然后將其反序列化為對象,然后可以輕松地獲取所需的數據.....

編輯……新代碼…………(包括您的ALMReleases類)

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

Module Module1

    Sub Main()
        Dim deserializedXML As Entities
        Dim xmlString As String = File.ReadAllText("xml.xml")

        Dim bufXML As Byte() = ASCIIEncoding.UTF8.GetBytes(xmlString)
        Dim ms1 As MemoryStream = New MemoryStream(bufXML)

        Dim serializer As XmlSerializer = New XmlSerializer(GetType(Entities))

        Try
            Using reader As XmlReader = New XmlTextReader(ms1)
                deserializedXML = DirectCast(serializer.Deserialize(reader), Entities)

                Dim releaseInformation = (From e In deserializedXML.Entity Select New ALMReleases With {
                                                                         .relName = e.Fields.Field(0).Value.FirstOrDefault,
                                                                         .relEndDate = e.Fields.Field(1).Value.FirstOrDefault,
                                                                         .relReqCount = e.Fields.Field(2).Value.FirstOrDefault,
                                                                         .relUsedPlans = e.Fields.Field(3).Value.ToList
                                                                         }).ToList
                Dim i = 0
            End Using
        Catch ex As Exception

        End Try
        Console.ReadKey()

    End Sub

End Module

Public Class ALMReleases
    Friend relEndDate As String
    Friend relName As String
    Friend relReqCount As String
    Friend relUsedPlans As List(Of String)
End Class

<XmlRoot(ElementName:="Field")>
Public Class Field
    <XmlElement(ElementName:="Value")>
    Public Property Value() As List(Of String)
        Get
            Return m_Value
        End Get
        Set
            m_Value = Value
        End Set
    End Property
    Private m_Value As List(Of String)
    <XmlAttribute(AttributeName:="Name")>
    Public Property Name() As String
        Get
            Return m_Name
        End Get
        Set
            m_Name = Value
        End Set
    End Property
    Private m_Name As String
End Class

<XmlRoot(ElementName:="Fields")>
Public Class Fields
    <XmlElement(ElementName:="Field")>
    Public Property Field() As List(Of Field)
        Get
            Return m_Field
        End Get
        Set
            m_Field = Value
        End Set
    End Property
    Private m_Field As List(Of Field)
End Class

<XmlRoot(ElementName:="Entity")>
Public Class Entity
    <XmlElement(ElementName:="Fields")>
    Public Property Fields() As Fields
        Get
            Return m_Fields
        End Get
        Set
            m_Fields = Value
        End Set
    End Property
    Private m_Fields As Fields
    <XmlElement(ElementName:="RelatedEntities")>
    Public Property RelatedEntities() As String
        Get
            Return m_RelatedEntities
        End Get
        Set
            m_RelatedEntities = Value
        End Set
    End Property
    Private m_RelatedEntities As String
    <XmlAttribute(AttributeName:="Type")>
    Public Property Type() As String
        Get
            Return m_Type
        End Get
        Set
            m_Type = Value
        End Set
    End Property
    Private m_Type As String
End Class

<XmlRoot(ElementName:="Entities")>
Public Class Entities
    <XmlElement(ElementName:="Entity")>
    Public Property Entity() As List(Of Entity)
        Get
            Return m_Entity
        End Get
        Set
            m_Entity = Value
        End Set
    End Property
    Private m_Entity As List(Of Entity)
    <XmlAttribute(AttributeName:="TotalResults")>
    Public Property TotalResults() As String
        Get
            Return m_TotalResults
        End Get
        Set
            m_TotalResults = Value
        End Set
    End Property
    Private m_TotalResults As String
End Class

使用代碼...

  1. 創建一個新的VB.NET控制台應用程序
  2. 將上面的代碼復制並粘貼到“ Module1”文件中(替換自動生成的代碼)
  3. 打開文件資源管理器並導航到'\\…\\ bin \\ Debug'文件夾(應用程序exe也將在其中編譯)
  4. 創建一個新的文本文件並將其重命名為“ xml.xml”
  5. 在記事本中打開xml.xml,粘貼您的XML(與您的問題完全相同)並保存文件
  6. 返回Visual Studio,按F5鍵運行代碼。

將出現一個控制台窗口,顯示您所需的結果

一旦該代碼生效,您就可以查看其工作方式並對其進行修改以滿足您的特定需求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM