2014-06-05 2 views
0

Linq에서 XML로 새롭게 태어났다. 성이 내가 원하는 비어 있으면, 그래서 나는 내가 만약에 한 Statment을하고 싶은 데이터베이스에서 일부 데이터를 가져 오는 다음 각 문장의를 usng 및조건에 따라 XML을 작성하십시오 Linq to XML

Dim MyCustomers As IQueryable(Of Customer) = GetCUstomers 
    Dim XDoc As XDocument = <?xml version="1.0" encoding="UTF-8" standalone="yes"?<Customers></Customers> 

    For Each c As Customer In MyCustomers 
    Xdoc.Root.Add(<CustomerID=<%= c.Id %> 
    <FirstName><%= c.Name %></FirstName> 
    <Surname><%= c.Surname %></Surname> 
    Next 

즉, 각 데이터 행을 추가하여 XDocument를 사용하여 XML 문서를 만드는 오전 그 요소는 완전히 제거되어야합니다. 내가

<%= If (string.IsnullEmpty(c.Surname) Then %> 

다른 조합을 사용하여 시도

<CustomerID=123> 
<FirstName>Name</FirstName> 
<Surname>Surname></Surname> 

<CustomerID=123> 
<FirstName>Name</FirstName> 

하지 않으면 고객의 성씨 XML 존재 그렇다면

이지만, 무엇이든 내가 해보 구문 에러 Ive는 MSDN을 검색했으며 대부분의 예제는 노드를 가져 오는 것을 언급하지만 조건에 따라 XML 파일에 노드/요소를 만들지는 않습니다. 임은이 방법에 접근하는 방법에 정말로 분실 했습니까?

아무도 도와 줄 수 있습니까?

답변

1

아마도 일부 코드가 깨져서 생각 났을 것입니다. <CustomerID=123>과 같은 잘못된 XML 요소가 있는데, 아마도 <Customer ID=123>이어야합니다. 즉, 다음과 같은 (LINQPad에서 실행) 당신이 원하는대로, 내 생각, 그리고 잘하면 당신의 코드에 적응할 수있다.

Sub Main 
    Dim MyCustomers = New List(Of Customer)() From { 
     New Customer() With { .ID = 1, .Name = "Cust1", .Surname = "Surn1" }, 
     New Customer() With { .ID = 2, .Name = "Cust2" }, 
     New Customer() With { .ID = 3, .Name = "Cust3", .Surname = "Surn3" }, 
     New Customer() With { .ID = 4, .Name = "Cust4" } 
    } 
    Dim Xdoc = <?xml version="1.0" encoding="UTF-8" standalone="yes"?><Customers></Customers> 
    For Each c As Customer In MyCustomers 
     Dim cust = 
      <Customer ID=<%= c.Id %>> 
       <FirstName><%= c.Name %></FirstName> 
      </Customer> 
     If c.Surname IsNot Nothing Then 
      cust.Add(<Surname><%= c.Surname %></Surname>) 
     End If 
     Xdoc.Root.Add(cust) 
    Next 
    Xdoc.Dump() 
End Sub 

' Define other methods and classes here 
Public Class Customer 
    Public Property ID As Integer 
    Public Property Name As String 
    Public Property Surname As String 
End Class 

업데이트 여기

은 상기 루프이지만, 선택적 <Surname> 요소를 추가 포함 LINQ 쿼리를 사용. 개인적으로 볼 때 위의 논리는 더 읽기 쉽지만 두 출력 모두 동일한 출력을 생성합니다. - 내가 그 라인을 경우 명시 할 필요는 여기로이 불행하게도 XDoc.Root.Add 내 코드로 어려움을 겪고 메신저로 내 경우 도움이 나던

<Customers> 
    <Customer ID="1"> 
    <FirstName>Cust1</FirstName> 
    <Surname>Surn1</Surname> 
    </Customer> 
    <Customer ID="2"> 
    <FirstName>Cust2</FirstName> 
    </Customer> 
    <Customer ID="3"> 
    <FirstName>Cust3</FirstName> 
    <Surname>Surn3</Surname> 
    </Customer> 
    <Customer ID="4"> 
    <FirstName>Cust4</FirstName> 
    </Customer> 
</Customers> 
+0

감사 : 여기

For Each c As Customer In MyCustomers Xdoc.Root.Add( <Customer ID=<%= c.Id %>> <FirstName><%= c.Name %></FirstName> <%= From sn In New String() { c.Surname } Where sn IsNot Nothing Select <Surname><%= sn %></Surname> %> </Customer> ) Next 

는 출력 XML이 필요합니다. AFAIK 문법은 <% = – Computer

+0

으로 시작합니다 @Computer 저는 여러분이 실행하고있는 것이 [XML 리터럴 익스프레션]에 조건부 로직을 넣는 것은 유효하지 않다고 생각합니다. (http://msdn.microsoft.com/en-us/library /bb384964.aspx). 쿼리를 포함 할 수 있습니다 - 나는 또한 ** 당신이 원하는 것을 할 수있는 예제로 대답을 업데이트 할 것입니다. – Mark