【问题标题】:How do I get then filter XML from a SQL Server 2000 DB?如何从 SQL Server 2000 DB 中获取然后过滤 XML?
【发布时间】:2011-05-07 23:21:32
【问题描述】:

我在 SQL Server 2000 中有一个表,其中包含我需要在 C# ASP.NET 2.0 页面上显示的 XML 文本字段。我需要检索 XML,然后过滤掉大约 80 个可能元素的列表(或者保留 20 个可能元素的白名单可能会更好)。

我可以从数据库中提取 xml 并将其显示在我的 .aspx 页面上,但我不确定如何首先过滤掉任何元素。

示例 XML

<Message> 
  <MessageNumber>
    1234
  </MessageNumber> 
  <MessageType>
    Auto Notice
  </MessageType> 
  <UPMessageNumber>
    5501
  </UPMessageNumber> 
  <MessageID>
    121223
  </MessageID> 
  <ResponseTo>
    654321
  </ResponseTo>
  <DateTime>
    2010-11-10 09:35:00
  </DateTime>
</Message> 

在这种情况下,我需要先过滤掉UPMessageNumberMessageID,然后再将其显示在页面上。

感谢您的任何想法。

【问题讨论】:

    标签: c# asp.net xml sql-server-2000


    【解决方案1】:

    您可以使用XSLT 将输入 XML 转换为修改后的输出。

    C# 示例here.

    这篇分步文章向您展示 如何应用可扩展样式表 语言 (XSL) 转换 (XSLT) 到可扩展标记语言 (XML) 使用 XslTransform 记录文档 类来创建一个新的 XML 文档。 XSL 是一种基于 XML 的语言 旨在转换一个 XML 文档 到另一个 XML 文档或 XML 文件到任何其他结构化 文件。

    上一个问题here 直接解决了如何构造XSL 进行元素剥离。

    我认为您需要的 XSL 是:

    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:output method="xml"/>
    
      <xsl:template match="@*|node()" priority="10">
        <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
      </xsl:template>
    
      <xsl:template match="UPMessageNumber | MessageID" priority="20">
      </xsl:template>
    
    </xsl:stylesheet>
    

    第一个xsl:template默认复制所有节点。第二个省略了命名元素。

    【讨论】:

    • 所以我的问题是当 XML 不是文件时如何转换它?我将其作为 XML 对象,但我没有找到将 xsl 的引用添加到对象的位置。如果它是一个文件,我可以添加“xml-stylesheet”标签。
    • @zk - 您可以直接在 XmlDocument 上使用 XslCompiledTransform.Transform - msdn.microsoft.com/en-us/library/ms163434.aspx - 如果您遇到困难,请告诉我(或就此发布新问题)
    【解决方案2】:

    如果您想以一种简单的方式进行操作,您可以利用 DataSet 类来读取您的 xml,然后使用数据视图过滤器。

        DataSet ds = new DataSet();
        ds.ReadXml(@"C:\so.xml");
        DataTable dt = ds.Tables[0];
        DataView dv = dt.DefaultView;
        dv.RowFilter = "Your Row Filter" //"MessageNumber<>4567" or construct a filter using //a helper
        //Bind dv to grid ??
    

    再次,一旦您将数据放入数据集中,您就可以执行各种操作,例如选择性显示列,我不确定您是想从查询角度过滤数据还是从视图中“隐藏”数据它仍然存在

    【讨论】:

    • fyi 我从文件中读取了 xml,我看到您正在从数据库中获取数据,但您仍然可以将底层 xml 放入数据集 fyi
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多