2010-10-02 144 views
2

這樣可以在XML字符串中使用像<%=person.LastName %>這樣的變量嗎?LINQ to SQL to XML(在C#中使用XML文字)

XElement letters = new XElement("Letters"); 

XElement xperson = XElement.Parse("<Table><Row><Cell><Text> 
    <Segment>Dear <%=person.Title%> <%=person.FirstName%> <%=person.LastName%>, 
    </Segment></Text></Cell></Row>..."); 

foreach (Person person in persons){ 
    letters.Add(xperson) 
} 

如果這是可能的,這將是一個救星,因爲我不能使用的XElement和XAttribute手動添加節點。我們有多個模板,他們經常更改(即時編輯)。

如果這是不可行的,你能否想到另一種方式,以便我可以使用XML模板?

看起來它可能在VB http://aspalliance.com/1534_Easy_SQL_to_XML_with_LINQ_and_Visual_Basic_2008.6

+1

這與LINQ to SQL有什麼關係? – svick 2010-10-03 13:10:10

回答

1

這是被稱爲XML Literals獨家VB.NET功能。它被添加到VB 9.0中。 C#目前不支持此功能。雖然微軟將來會在兩種語言之間陳述它的intent to bridge the gap,但是不清楚這個功能是否會在不久的將來推出給C#。

你的例子對我來說似乎並不清楚。在解析實際的XML之前,您會希望使用foreach循環,因爲這些值綁定到當前的Person對象。例如,下面的XML文本的VB例子:

Dim xml = <numbers> 
      <%= From i In Enumerable.Range(1, 5) 
       Select <number><%= i %></number> 
      %> 
      </numbers> 

For Each e In xml.Elements() 
    Console.WriteLine(e.Value) 
Next 

上面的代碼中構建以下XML:

<numbers> 
    <number>1</number> 
    <number>2</number> 
    <number>3</number> 
</numbers> 

然後將其寫入1, 2, 3控制檯。

如果您不能修改您的C#代碼來動態構建XML,那麼也許您可以編寫遍歷XML模板的代碼,並搜索屬性和元素中的預定字段,然後根據需要設置值。這意味着您必須遍歷每個節點中的所有屬性和元素,並使用一些switch語句來檢查模板字段名稱。如果您遇到模板字段,並且您當前正在迭代屬性,則會設置屬性的設置方式,而如果您正在迭代元素,則會設置元素的設置方式。這可能不是最有效的方法,但是是一種解決方案。

最簡單的解決方案是使用VB.NET。您可以將其作爲獨立項目進行開發,添加對C#項目的dll的引用,將數據傳遞給VB.NET類並讓它返回最終的XML。

編輯:澄清,使用VB.NET不會繞過需要更新模板。它使您可以更容易地將佈局指定爲XML文字。所以一旦佈局改變,代碼仍然需要在VB中更新。您無法從文本文件加載XML模板,並期望字段被這種方式綁定。對於一個真正動態的解決方案,允許您編寫一次代碼並閱讀不同的模板,我的第一個建議更合適。