2012-01-10 12 views
1

私はソースXMLファイルを持っています。結果のXMLに含める要素をユーザーが選択するためのUIを提供します。 UIがどのように機能するかは、XSDファイルをロードし、要素をcheckbox treeに表示することです。ユーザーは必要な要素を確認できます。C#でのXMLフィルタリング

UIが正常に動作しますが、私は、バックエンドのロジック上のいくつかのアドバイス/指導を必要とする:どのように私は、ユーザーのを保存しなければならない基本的に私がソースのXMLへの「フィルタを適用」したいのですが、

  1. 選択(区切り文字で区切られた値または??)および
  2. この「フィルタ」(多分XSLT)を適用する方法は?

EDIT: のsrc 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

ソースファイルをコピーし、選択されていない要素のxpathのリストまたは配列を作成し、xpathを反復してそれぞれを削除して結果を返します。または私はここに何かを逃していますか? – emd

答えて

1

処理は、表示されていないXMLの構造に大きく依存します。

それはこのような単純なことができ:指名手配、正しい結果が生産される

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

:この変換は、次の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> 

(ユーザー指定の要素ACのみが出力に残ります)

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

私は構造のサンプルを含めました。 – Laguna

+0

@ラグーナ:それは良い最初のステップです。次に、可能なユーザ指定の選択肢(提供されたXMLから選択可能なものと選択不可能なもの(必須))は何ですか? –

2

本当にXSLTを使用してこれを行う場合は、この方法を試してください。 2番目のテンプレートに追加するXPath式に一致しないすべての要素と属性がコピーされます。

<?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 filtering as3"がこの質問と関係があるかどうか知っていますか?私はここで野生の推測をしています。 – Laguna

+1

ActionScript 3を使用してXMLをフィルタリングする方法を指していると思います。Linq to XMLを使用して同様のことを行うことはできますが、XSLTアプローチよりも多くのコードを書く必要があります。 –

1

我々は、サーバーの構成ファイルで作業するユーザーフレンドリーなツールを作成したときではない、正確である(:それは、特に高速ではありませんので、あなたは、動的にXSLTを生成し、それをコンパイルする必要がありますユーザーフレンドリーな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

関連する問題