Как мне получить фильтр XML из базы данных SQL Server 2000? - PullRequest
2 голосов
/ 10 ноября 2010

У меня есть таблица в SQL Server 2000 с текстовым полем, содержащим XML, который мне нужно отобразить на странице C # ASP.NET 2.0.Мне нужно извлечь 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> 

В этом случае мне потребуется отфильтровать UPMessageNumber и MessageID перед отображением на странице.

Спасибо за любые идеи.

Ответы [ 2 ]

3 голосов
/ 10 ноября 2010

Вы можете сделать это, используя XSLT , чтобы преобразовать входной XML в измененный вывод.

C # пример здесь .

Эта пошаговая статья показывает вам как применить расширяемую таблицу стилей Преобразование языка (XSL) (XSLT) к расширяемому языку разметки (XML) документ с использованием XslTransform класс для создания нового XML-документа. XSL - это язык на основе XML, который предназначен для преобразования одного документа XML в другой документ XML или XML документ в любой другой структурированный документ.

Предыдущий вопрос здесь непосредственно касается того, как создать 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 копирует все узлы по умолчанию. Второй опускает именованные элементы.

1 голос
/ 10 ноября 2010

Если вы хотите сделать это в упрощенном виде, вы можете использовать класс 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 ??

Снова, когда ваши данные внабор данных, вы можете делать все что угодно, например выборочное отображение столбцов, я не уверен, хотите ли вы отфильтровать данные с точки зрения запроса или «скрыть» данные от представления, пока оно еще присутствует

...