2012-01-03 17 views
0

私は正常にこのxmlファイルをロードしていますlinqの名前空間で要素の値を設定する方法は?

<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="67" uniqueCount="39"> 
    <si> 
    <t>INVOICE</t> 
    </si> 
    <si> 
    <t>INVOICE #</t> 
    </si> 
    <si> 
    <t>Bill To:</t> 
    </si> 
    <si> 
    < t>DESCRIPTION</t> 
    </si> 
    <si> 
    <t>AMOUNT</t> 
    </si> 
    <si> 
    <t>TOTAL</t> 
    </si> 
    <si> 
    <t>FOR:</t> 
    </si> 
    <si> 
    <t>Positive Behavior Support Corp</t> 
    </si> 
    <si> 
    <t>8108 SE Coconut St.</t> 
    </si> 
    <si> 
    <t>Hobe Sound, FL 33455</t> 
    </si> 
    <si> 
    <t>772-349-6317 Phone 772-675-9100 Fax</t> 
    </si> 
    <si> 
    <t>EIN 20-5268843</t> 
    </si> 
    <si> 
    <t>Provider 693068996</t> 
    </si> 
    <si> 
    <t>Rate</t> 
    </si> 
    <si> 
    <t>Units</t> 
    </si> 
    <si> 
    <t>DATE</t> 
    </si> 
    <si> 
    <t>Michael Nolan Ph.D. BCBA</t> 
    </si> 
    <si> 
    <t>____________________________________________</t> 
    </si> 
    <si> 
    <t>BCBA       Date</t> 
    </si> 
    <si> 
    <t>CLIENT:</t> 
    </si> 
    <si> 
    <t>Date:</t> 
    </si> 
    <si> 
    <t>Behavior Assistant- L. Bresson</t> 
    </si> 
    <si> 
    <t>Email:</t> 
    </si> 
    <si> 
    <t>1 Unit = 1 hour</t> 
    </si> 
    <si> 
    <t>TOTALS</t> 
    </si> 
    <si> 
    <t>[email protected]</t> 
    </si> 
    <si> 
    <t>Attn: Cecilia</t> 
    </si> 
    <si> 
    <t>Behavior Assistant- B. Bresson</t> 
    </si> 
    <si> 
    <t>Behaviror Ass't -N Giarratano</t> 
    </si> 
    <si> 
    <t>Signature of Representatives Approval   Date</t> 
    </si> 
    <si> 
    <r> 
     <t xml:space="preserve">Behavior Asst- </t> 
    </r> 
    <r> 
     <rPr> 
     <sz val="9" /> 
     <rFont val="Arial" /> 
     <family val="2" /> 
     </rPr> 
     <t>N Giarratano-</t> 
    </r> 
    <r> 
     <rPr> 
     <sz val="10" /> 
     <rFont val="Arial" /> 
     <family val="2" /> 
     </rPr> 
     <t>08</t> 
    </r> 
    </si> 
    <si> 
    <t>Behavior Asst- B. Bresson-08</t> 
    </si> 
    <si> 
    <t>Behavior Asst- L. Bresson-08</t> 
    </si> 
    <si> 
    <t>&lt;@Invoice&gt;</t> 
    </si> 
    <si> 
    <t>&lt;@For&gt;</t> 
    </si> 
    <si> 
    <t>&lt;@Client&gt;</t> 
    </si> 
    <si> 
    <t>&lt;@Caregiver&gt;</t> 
    </si> 
    <si> 
    <t>&lt;@Email,@Address,@City,@State,@Zip&gt;</t> 
    </si> 
    <si> 
    <t>&lt;@Date&gt;</t> 
    </si> 
</sst> 

を次のように私は自分のアプリケーションでxmlファイルを持っているのSharePoint 2010用のSilverlight Webパーツを開発しています。今私は、XMLファイルから名前 "t"を持つすべての要素を次のように処理しています。

XNamespace ns = xmlDoc.Root.Name.Namespace; 
      var eles = from c in xmlDoc.Descendants(ns + "si") 
         select c.Element(ns + "t"); 

これも正常です。 しかし、私は次のクエリを使用する場合、それはオブジェクト参照がオブジェクトのインスタンスに設定されていないとして、それは私にエラーを与えてくれ

eles.Elements(ns + "t").Where(x => x.Element(ns + "t").Value == "&lt;@Date&gt;").SingleOrDefault().SetElementValue(ns + "t","hi"); 

をエラーが発生します。私は、既存のXMLで 『こんにちは」と<@Date>』置き換えることができますどのように。あなたは私に、私は上記の問題を解決できるような任意のコードまたはリンクを提供してくださいできますか?

+0

[30]の結果ビューでI AMがnullになっています。それは働かない理由かもしれませんか?それが理由なら、どのようにクエリを書くべきですか? –

答えて

1

あなたeles変数はすでに<t>を返しています。 <t>の子は<t>なので、x.Element(ns + "t")は返されません(したがってnull、したがって.Valueはエラーです)。実際には、eles.Elements(ns + "t")は空のシーケンスであったはずです

また、C#用語の値は<@Date>&gt;/&lt;はxmlにのみ適用されます。

<si>のクエリには、<t>が含まれていません。よりよいバリアントは次のようになります。

var eles = xmlDoc.Descendants(ns + "si").Elements(ns + "t"); 
(0を処理し、1、または <si>あたり多く <t>

その後、その後、あなたは意味:

eles.SingleOrDefault(x => x.Value == "<@Date>").Value = "hi"; 
+0

動作していません。クエリeles.SingleOrDefault(x => x.Value == "<@Date>")のxのnull値を取得しています.Value = "hi";それでも、オブジェクト参照がオブジェクトのインスタンスに設定されていないというエラーが返されています。位置[30]の 'eles'の結果セットにnull値があります。それは働かない理由かもしれませんか?それが理由なら、どのように質問を書くべきですか? –

+0

[コメントの重複]あなたはデバッグに関するコメントを見たことがありますか?ブレークポイントを設定し、最初のクエリで返された要素のリストを調べます。必要な価値を持つものを探してください。あなた自身のための少しの問題解決をしなさい! – ColinE

+1

@ShaileshJaiswal私が書いた改訂された 'eles'クエリを見ましたか?問題は、私が書いたように、あなたの ''には ''がありません。つまり、 'c.Element(ns +" t ")'はそのレコードに対して 'null'を返します。上記の問題を別の 'eles'クエリで取り除きました。 –

0

あなたの最初のクエリが持つ要素を返します。名前 't'を指定すると、2番目のクエリは、これらの要素の子を名前 't'で検索します。これはドキュメントの構造に一致しません。2番目のクエリは次のようになります。

var matchingElement = eles.SingleOrDefault(x => x.Value == "&lt;@Date&gt;"); 

これで置換えを実行できます。

コードを開発するときにデバッガを使用することをおすすめします。ブレークポイントを指定してeles変数を調べると、最初のクエリによって実際に返されるものが実際に表示されます。

+0

これは機能しません。私はクエリでxのnull値を取得していますvar matchingElement = eles.SingleOrDefault(x => x.Value == "<@Date>");それでも、オブジェクト参照がオブジェクトのインスタンスに設定されていないというエラーが返されています。位置[30]の 'eles'の結果セットにnull値があります。それは働かない理由かもしれませんか?それが理由なら、どのようにクエリを書くべきですか? –

+0

デバッグに関する私のコメントは見ましたか?ブレークポイントを設定し、最初のクエリで返された要素のリストを調べます。必要な価値を持つものを探してください。あなた自身のための少しの問題解決をしなさい! – ColinE

+0

私はブレークポイントを設定し、 'eles'の結果を見ました。そこには、位置[30]にヌル値があります。 system.xml.linq.XElemnet [0]は「空のシーケンス」であり、位置[38]には必要な値があります。 –

関連する問題