2009-06-30 19 views
8

私は基本的にLINQの新しいブランドです。私はここで多くを見てきて、かなり混乱しています。私はLINQを使って強い型オブジェクトにすることを可能にするいくつかの例を見てきましたが、LINQを使ってさまざまなことをすることができるC#であるため、実際にはそれらを理解できません。私はXMLドキュメントからのすべての製品のリストを取得し、ジェネリックリストに入れたい -VB.NETのLINQ to XML

Dim productXML As XDocument = XDocument.Load(_ 
    Server.MapPath("~/App_Data/products.xml")) 

Dim products As List(Of Product) = 'some query to select all products ?' 

'set up Product properties here' 
someProduct.ProductID = 'somehow get productid from XML' 

EDITを:

とにかく、これは私がやろうとしているものです。

+2

実際、LINQのモットはC#とVBの間で似ています。 xmlは違いがあるいくつかの領域の1つで、VBを使ってC#ではなくVBを追加します; -p –

+0

ok ...どのようにしてこの問題を解決するのか? – Jason

+1

Jsonはxmlのヘルプを探しています... thatsちょっと面白い! –

答えて

11

マークは正しいですが、VBでは素敵なことをたくさんできます。私は自分自身C#の男ですが、私はちょうどあなたのためにそれを行う方法を見てVBのソリューションをノックした。私は以下のコードを掲載し、重要な部分を説明しました。私はVBがXmlに持っている機能に非常に感銘を受けました!

XmlをXDocumentに読み込むことが既に管理されているというコードサンプルがあります。 XDocument.Loadを完了したら、特別な構文を使用してXmlドキュメントにアクセスできます。

まずは、ドキュメントからすべての製品を取得する必要があります。すなわち全て< Product>要素を含む。私たちは、以下を実行する必要があります

Dim products = productsDoc...<Product> 

これは、ドキュメントからすべての<製品>要素が欲しいと言っています。これは、XElementsのIEnumerableコレクションを提供します。

コレクションから個々の商品を引き取ったら、名前や価格などの商品の価値にアクセスしたいと思うでしょう。私たちは、次の操作を実行する必要があることを行うには:

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

はここであなたが見てするのに予想される出力と一緒に完全な例です:

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 

プログラムの出力は次のようになります。

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 

私はこれが役に立つと願っています。詳細をご希望の場合は、

就寝時に何かを書くのは難しいです。 :-)

+1

3つのピリオド...本当に... –

+4

はい、それは奇妙な構文です。現在のノードの下にあるすべてのノードをチェックするように指定されています。 –

+0

これはすばらしいことですが、やってみる方法は分かっています匿名ではなく強い型のオブジェクトを使用する – Jason

0

これはどうですか?

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

そのリンクはXMLの構築のためのものですか?私はXMLを構築するつもりはない...私はすでにそれを行っている。この時点では事実上静的です。私はそれを読んでオブジェクトに解析し、その後ジェネリックリストに入れる必要があります。 – Jason

+0

List(Of Product)のタイプと同様に、「item」を「Product」にするにはどうすればよいですか? – Jason

+0

"From item in productXML Select item"の "productXML"の下にこのエラーが表示されます。タイプSystem.XML.Linq.XDocumentの式は照会できません。アセンブリ参照やLINQプロバイダの名前空間インポートが欠落していないことを確認してください...しかし、System.Linqをインポートしました.... – Jason

2

Doctor Jonesは優れた例を投稿しました。

匿名型のオブジェクトとは対照的に、名前付きの型のオブジェクトのコレクションを取得するには(両方が強く型付けされている)は、この操作を行います。

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

を私はここにパーティーに少し遅れるかもしれませんが、私はできません誰もXmlSerializerオプションを提供していないと信じて:

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 

あなたは、共有機能から製品のIEnumerableをを返すことができます。

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

これはLinqToXmlをそのまま使用しませんが、xmlを製品のiEnumerableに逆シリアル化します。これは通常どおりLinqを使用できます。