LINQ to XML in VB.NET

前端 未结 4 1509
南方客
南方客 2020-12-10 06:07

I\'m basically brand new to LINQ. I\'ve looked around a lot on here and am pretty confused. I\'ve seen some examples that allow me to strong type objects using LINQ but I do

相关标签:
4条回答
  • 2020-12-10 06:31

    Marc is right, VB lets you do lots of nice stuff. I'm a C# guy myself, but I just knocked up a VB solution to see how to do it for you. I've posted the code below and explained the key parts. I was very impressed with the features VB has for Xml!

    I see in your code sample that you've already managed to load your Xml into an XDocument. Once you've done your XDocument.Load you can access the Xml document using some special syntax.

    For starters we want to get all the products from the document; i.e. all < Product > elements. We need to do the following:

    Dim products = productsDoc...<Product>
    

    This says that you want all < Product > elements from the document. This gives us an IEnumerable collection of XElements.

    Once we've pulled an individual product from the collection we'll want to access the product's values like it's name or price. To do that we need to do the following:

    ' this gets the value of the price element within a product
    product.<Price>.Value
    

    Here's a full example along with the expected output for you to look at:

    Module Module1
    
        ' some products xml to use for this example
        Dim productsXml = <Xml>
                              <Product>
                                  <Name>Mountain Bike</Name>
                                  <Price>59.99</Price>
                              </Product>
                              <Product>
                                  <Name>Arsenal Football</Name>
                                  <Price>9.99</Price>
                              </Product>
                              <Product>
                                  <Name>Formula One Cap</Name>
                                  <Price>14.99</Price>
                              </Product>
                              <Product>
                                  <Name>Robin Hood Bow</Name>
                                  <Price>8.99</Price>
                              </Product>
                          </Xml>
    
        Sub Main()
    
            ' load the xml into an XDocument
            ' NOTE: this line isn't needed when using inline XML as per this example, 
            ' but I wanted to make this code easy to modify for reading in text files
            Dim productsDoc = System.Xml.Linq.XDocument.Parse(productsXml.ToString())
    
            ' get all <Product> elements from the XDocument
            Dim products = From product In productsDoc...<Product> _
                           Select product
    
            ' go through each product
            For Each product In products
                ' output the value of the <Name> element within product
                Console.WriteLine("Product name is {0}", product.<Name>.Value)
                ' output the value of the <Price> element within product
                Console.WriteLine("Product price is {0}", product.<Price>.Value)
            Next
    
        End Sub
    
    End Module
    

    Program output is:

    Product name is Mountain Bike
    Product price is 59.99
    Product name is Arsenal Football
    Product price is 9.99
    Product name is Formula One Cap
    Product price is 14.99
    Product name is Robin Hood Bow
    Product price is 8.99
    

    I hope this has been helpful. If you'd like any more information please just ask :-)

    It's hard to write something coherent at bedtime! :-)

    0 讨论(0)
  • 2020-12-10 06:31

    I may be a little late to the party here, but I can't believe nobody has offered the XmlSerializer option:

    Public Class Product
        Property Description As String
        Property Price As Double
    
        Public Shared Function FromXml(serverPath As String) As IEnumerable(Of Product)
    
           Using fs = IO.File.OpenRead(serverPath)
               Dim p As New Product
               Return New XmlSerializer(p.GetType).Deserialize(fs)
           End Using
    
        End Function
    
    End Class
    

    You can then return an iEnumerable of Product from the shared function:

    dim listOfProducts = Product.FromXml(Server.MapPath("~/App_Data/products.xml"))
    

    This doesn't use LinqToXml as such, but it deserializes the xml to an iEnumerable of product, which you can use Linq on as usual.

    0 讨论(0)
  • 2020-12-10 06:36

    OK, how about this?

    Dim productXML As XDocument = XDocument.Load( _    
        Server.MapPath("~/App_Data/products.xml"))    
    '
    For Each product as Product In productXML.Document.Elements("Product")
        'do something with each product
    Next
    
    0 讨论(0)
  • 2020-12-10 06:41

    Doctor Jones posted an excellent example!

    To get a collection of named type objects as opposed to anonymous type objects (both are strongly typed) do this:

    Module Module1
    
    ' some products xml to use for this example '
        Dim productsXml As XElement = _
        <Xml>
            <Product>
                <Name>Mountain Bike</Name>
                <Price>59.99</Price>
            </Product>
            <Product>
                <Name>Arsenal Football</Name>
                <Price>9.99</Price>
            </Product>
            <Product>
                <Name>Formula One Cap</Name>
                <Price>14.99</Price>
            </Product>
            <Product>
                <Name>Robin Hood Bow</Name>
                <Price>8.99</Price>
            </Product>
        </Xml>
    
    Class Product
    
        Private _name As String
        Public Property Name() As String
            Get
                Return _name
            End Get
            Set(ByVal value As String)
                _name = value
            End Set
        End Property
    
        Private _price As Double
        Public Property Price() As Double
            Get
                Return _price
            End Get
            Set(ByVal value As Double)
                _price = value
            End Set
        End Property
    
    End Class
    
    Sub Main()
    
        ' get an IEnumerable of Product objects '
        Dim products = From prod In productsXml...<Product> _
                       Select New Product With {.Name = prod.<Name>.Value, .Price = prod.<Price>.Value}
    
        ' go through each product '
        For Each prod In products
            ' output the value of the <Name> element within product '
            Console.WriteLine("Product name is {0}", prod.Name)
            ' output the value of the <Price> element within product '
            Console.WriteLine("Product price is {0}", prod.Price)
        Next
    
    End Sub
    
    End Module
    
    0 讨论(0)
提交回复
热议问题