2

是否可以以<%=person.LastName %>这种方式使用 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

4

1 回答 1

1

这是一个专有的 VB.NET 功能,称为XML Literals。它是在 VB 9.0 中添加的。C# 目前不支持此功能。尽管 Microsoft 已表示打算在未来弥合这两种语言之间的差距,但尚不清楚此功能是否会很快在 C# 中实现。

你的例子对我来说似乎不清楚。您可能希望foreach在解析实际 XML 之前有循环,因为值绑定到当前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 模板并期望以这种方式绑定字段。对于允许您编写一次代码并阅读不同模板的真正动态解决方案,我的第一个建议更合适。

于 2010-10-03T02:18:40.033 回答