2012-01-10 2 views
1

У меня есть исходный XML-файл. и я предоставляю пользовательский интерфейс для пользователей, чтобы выбрать элементы, которые они хотят включить в результирующий XML. Как работает пользовательский интерфейс, загружая файл XSD и представляя элементы в checkbox tree. Затем пользователи могут проверять нужные элементы.XML-фильтрация в C#

Пользовательский интерфейс работает хорошо, но мне нужно несколько советов/руководство по фоновым логике: В основном я хочу «применить фильтр» к исходному XML, но

  1. , как следует ли сохранить данные пользователя выбор (в разделительных значениях разделителя или?) и
  2. Как применить этот «фильтр» (возможно, с XSLT)?

EDIT: Структура XML ЦСИ выглядит следующим образом:

<IDs> 
    <id1></id1> 
    <id2></id2> 
    ... 
</IDs> 
<Traveler> 
    <name></name> 
    <email></email> 
    ... 
<Traveler> 
<Segments> 
    <Segment i:type="Air"> 
    <carrier></carrier> 
    ... 
    </Segment> 
    <Segment i:type="Hotel"> 
    <supplier></supplier> 
    ... 
    </Segment> 
</Segments> 
<Notes> 
... 
</Notes> 

EDIT2: Все эти элементы могут быть проверены/бесконтрольно, чтобы включить в результате XML.

+2

Есть ли у вас код? –

+0

Нет, у меня нет кода для бэкэнд-логики bcz Я не решил, с каким подходом идти. – Laguna

+1

Скопируйте исходный файл, создайте список или массив xpaths для элементов, которые не выбраны, выполните итерацию xpaths и удалите их, верните результат. Или я чего-то не хватает? – emd

ответ

1

Обработка сильно зависит от структуры XML, которую вы не указали.

Это может быть так просто, как это:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="pWanted" select="'|A|C|'"/> 

<xsl:template match="node()|@*" name="identity"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*/*"> 
    <xsl:if test="contains($pWanted, concat('|',name(), '|'))"> 
    <xsl:call-template name="identity"/> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 

когда это преобразование применяется на следующий документ XML:

<t> 
    <A>1</A> 
    <B>2</B> 
    <C>3</C> 
</t> 

разыскиваемый, правильный результат производства (только выходные данные A и C остаются на выходе):

<t> 
    <A>1</A> 
    <C>3</C> 
</t> 
+0

Я включил образец структуры. – Laguna

+0

@ Lagoona: Это хороший первый шаг. Далее: каковы возможные параметры, заданные пользователем (что выбирается из предоставленного XML и что не выбирается (обязательно))? –

2

Если вы действительно хотите это сделать, используя XSLT, попробуйте этот подход. Он копирует все элементы и атрибуты, которые не соответствуют любому выражению XPath, которое вы добавляете ко второму шаблону. Вам придется динамически генерировать XSLT и скомпилировать его, поэтому он не будет особенно быстро:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="XPath for all non-selected elements"></xsl:template> 
</xsl:stylesheet> 
+0

спасибо. Я отвечу на ваш совет, если я захочу спуститься по пути xslt. знаете ли вы, что «xml-фильтрация as3» имеет какое-либо отношение к этому вопросу? Я беру на себя дикую догадку. – Laguna

+1

Я думаю, что это относится к способу фильтрации XML с помощью ActionScript 3. Вы можете сделать что-то подобное, используя Linq to XML, но для этого может потребоваться написать больше кода, чем подход XSLT. –

1

Когда мы создали удобный инструмент для работы с нашими файлами конфигурации сервера (которые не-точно -ser-friendly XML), мы решили сохранить пользовательские варианты (отличия от конфигурации по умолчанию) непосредственно как преобразование XSL.

В вашем случае это должно работать, но это зависит от точной структуры вашего XML. Если исходный XML-то вроде

<data> 
    <item id="1">...</item> 
    <item id="2">...</item> 
    ... 
</data> 

Вы можете сохранить выделение, как например .:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/data"> 
    <data> 
     <xsl:apply-templates select="item" /> 
    </data> 
    </xsl:template> 

    <xsl:template match="item[@id='1']"> 
    <xsl:copy-of select="."/> 
    </xsl:template> 
    <xsl:template match="item[@id='3']"> 
    <xsl:copy-of select="."/> 
    </xsl:template> 
    <xsl:template match="item[@id='4']"> 
    <xsl:copy-of select="."/> 
    </xsl:template> 

    <xsl:template match="node()" /> 
</xsl:stylesheet> 

Это достаточно просто ваш инструмент должен быть в состоянии загрузить его обратно и позволить пользователю изменять свой выбор.

+0

THX. Мне очень нравится этот подход при сохранении конфигурации. и хороший момент при выборе xml в качестве формата. – Laguna