.net 在嵌套控件中绑定sql server中的xml列和常规列

.net 在嵌套控件中绑定sql server中的xml列和常规列,.net,sql-server,xml,sql-server-2005,.net,Sql Server,Xml,Sql Server 2005,我有一个存储过程,它混合返回普通列和一个xml数据类型的“列”。例如: Select Field1, Field2, ( SELECT Certification As '@certification', LCID As '@lcid' FROM dbo.MemberCertifications FOR XML PATH('certification'), TYPE, ROOT('certific

我有一个存储过程,它混合返回普通列和一个xml数据类型的“列”。例如:

Select
     Field1,
     Field2,
    (
    SELECT
        Certification As '@certification',
        LCID As '@lcid'
    FROM
        dbo.MemberCertifications
    FOR XML PATH('certification'), TYPE, ROOT('certifications')
    ) AS Certifications 
 FROM
      .......
我将此结果绑定到gridview,并且需要将xml列绑定到嵌套的repeater,因为它包含父子数据

我已尝试将repeater数据源设置为列名,如下所示:

    <asp:Repeater ID="rp" runat="server" DataSource="<%# Eval("Certifications") %>">
      <ItemTemplate>                    
            <%#XPath("//@certification")%>                    
      </ItemTemplate>
    </asp:Repeater>   
但这不起作用。它看起来就像一根普通的绳子。如果我只是在ItemTemplate中写一个换行符,它会为列中的每个字符包含一个换行符

我也尝试过内联使用xmldatasource,但遇到了一个解析器错误:

    <asp:XmlDataSource ID="data_certs" runat="server" >
        <%# Eval("Certifications") %>
    </asp:XmlDataSource> 
我在这里已经走到了尽头——我正准备通过反序列化xml在代码中构建结果。我其实并不需要任何gridview功能


有什么想法吗?

你能用LINQ转换XML吗?您可以使用以下方式加载它:

XDocument document = XDocument.Load(" .. xml content here ..");
rpt.DataSource = document.Root.Elements("certification").Select(i => new { Field1 = i.Element("Field1").Value, Field2 = i.Element("Field2").Value });
rpt.DataBind();
基本上,我所做的是将XML文档转换为匿名类型,中继器可以对其进行反射。我肯定有些语法有点不对劲。我不记得它是值属性还是其他什么,我的linq到XML有点生疏:-但这基本上是从代码中实现的

内联标记我不知道任何方法是否有效,因为它来自数据库。XmlDataSource需要一个文件,而不是来自数据库的文件,至少据我所知,可能是错误的


HTH.

虽然不完全允许我以声明的方式完成这项工作,但它是基于Brian的输入工作的。也许绑定语法已经出现了,但我没有时间来整理它

中继器:

<asp:Repeater ID="rp" runat="server" DataSource='<%# EnumerableCertifications(Eval("Certifications")) %>'>
  <ItemTemplate>                 
    <%#Eval("certification")%><br />
  </ItemTemplate>
</asp:Repeater>

是的,通过编程实现这一点是可能的——无论是使用linq还是反序列化。我想我想知道如何以声明的方式实现这一点。linq to xml可以做到这一点,就像使用普通xml和xpath绑定语法一样,但linq更简洁。谢谢你的建议。
Public Function EnumerableCertifications(ByVal xml As Object) As IEnumerable
    If xml Is DBNull.Value OrElse String.IsNullOrEmpty(xml) Then
        Return Nothing
    Else
        Using sr As New System.IO.StringReader(xml.ToString())
            Dim document As XDocument = XDocument.Load(sr)
            Dim q = From c In document.Descendants("certification") Where c.Attribute("lcid").Value = Locale.ToString() _
                    Select New With {.certification = c.Attribute("certification").Value}
            Return q
        End Using
    End If

End Function