2009-06-30 2 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' 

편집을 :

어쨌든,이게 내가 할 노력하고있어 것입니다.

+2

실제로 LINQ의 동작은 C#과 VB에서 비슷합니다. xml은 차이가있는 몇 가지 영역 중 하나입니다. VB에서 물건을 추가하는 것이지 C#이 아닙니다. -p –

+0

ok ...이 문제를 해결하는 데 도움이되는 방법은 무엇입니까? – Jason

+1

Json은 xml 도움을 찾고 ... 그게 좀 재밌 네요! –

답변

11

마크는 옳습니다. VB는 좋은 물건을 많이 만듭니다. 나는 C#을 사용하는 사람이지만, VB 솔루션을 사용하여 어떻게 처리하는지 살펴 보았습니다. 아래 코드를 게시하고 핵심 부분을 설명했습니다. 나는 VB가 XML을 가지고있는 기능에 매우 감동했다!

코드 샘플에서 Xml을 XDocument로로드 할 수있었습니다. XDocument.Load를 완료하면 몇 가지 특수 구문을 사용하여 XML 문서에 액세스 할 수 있습니다.

처음에는 문서에서 모든 제품을 가져오고 싶습니다. 즉 모두 < 제품> 요소입니다. 우리는 다음을 수행해야합니다

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

세 개의 마침표 ... 정말 ... ... –

+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을 만들려하지 않는다 ... 나는 이미 그것을했다. 이 시점에서 사실상 정적입니다. 나는 그것을 읽고 그것을 객체로 그리고 나서 generics리스트로 파싱해야한다. – 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

내가 늦게 여기에 파티에 조금있을 수 있습니다,하지만 난 할 수 없습니다

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

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을 반환 할 수 있습니다 생각 아무도 XmlSerializer 옵션을 제공하지 않았다

이렇게하면 LinqToXml을 사용하지 않지만 xml을 iEnumerable 제품으로 역 직렬화합니다.이 제품은 보통 때처럼 Linq를 사용할 수 있습니다.