2012-01-03 76 views
0

我開發的SharePoint 2010 Silverlight Web部件我有一個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文件。現在我正在使用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]的結果視圖中得到空值。它能成爲不工作的原因嗎?如果是這個原因,我該如何編寫查詢? – 2012-01-03 08:26:28

回答

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>」).Value =「hi」;它仍然給出錯誤'對象引用未設置爲對象的實例。我在位置[30]的'eles'的結果集中獲得了空值。它能成爲不工作的原因嗎?如果是這個原因,我應該怎麼寫查詢 – 2012-01-03 09:20:45

+0

[下面的評論重複]你看到我的調試評論?設置一個斷點並檢查第一個查詢返回的元素列表。尋找你需要的價值。爲自己做一點問題解決! – ColinE 2012-01-03 09:26:24

+1

@ShaileshJaiswal你看到我寫的修改過的'eles'查詢嗎?問題在於,正如我寫的那樣,你的一個''缺少'',這意味着'c.Element(ns +「t」)'返回該記錄的空值。我刪除了上面的問題,用不同的'eles'查詢。 – 2012-01-03 09:35:00

0

你的第一個查詢返回的元素名字't',你的第二個查詢然後查找這些元素的子元素,也使用名稱't'。這不符合您的文檔的結構,你的第二個查詢應該是:

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

就可以執行你的更換。

我會建議在開發代碼時使用您的調試器。如果你斷點,然後檢查eles變量,你可以看到你的第一個查詢返回的內容。

+0

它不起作用。我在查詢中得到x中的空值var matchingElement = eles.SingleOrDefault(x => x.Value ==「<@Date>」);它仍然給出錯誤'對象引用未設置爲對象的實例。我在位置[30]的'eles'的結果集中獲得了空值。它能成爲不工作的原因嗎?如果是這樣的話,那我應該怎麼寫查詢 – 2012-01-03 09:23:45

+0

你見過我對調試的評論嗎?設置一個斷點並檢查第一個查詢返回的元素列表。尋找你需要的價值。爲自己做一點問題解決! – ColinE 2012-01-03 09:26:11

+0

我已經設置了斷點並看到了'eles'的結果。在[30]位置有空值。有system.xml.linq.XElemnet [0]是'空序列',在[38]位置有我需要的值。 – 2012-01-03 09:34:31

相關問題