2014-01-07 136 views
1

我有一個Web服務,它需要以xml格式輸入並且輸入需要被編碼。我工作的環境是.NET 4.5,後面的代碼是c#。我必須在SOAP請求中包含編碼的xml輸入,並將其發送到將輸出作爲SOAP響應發回的服務。我可以發送SOAP請求並接收響應,但我在發送xml輸入時遇到了問題。輸入涉及oracle的數據。比如我有一個表的客戶在運行時創建XML

客戶

CustomerName | key  | Value | 
______________________________________ 
AAA   | Grocery | 10  | 
AAA   | Clothing | null  | 

在上表中,如果值都是空我需要指的是與外鍵=「關鍵」的其他表,並從價值另一張桌子。

我想構建XML,因爲我從查詢中獲取值。所以,如果我通過傳遞「AAA」查詢客戶表,首先我要讀的雜貨店和值10和XML應該像

<customer> 
<Grocery>10</Grocery> 
</customer> 

然後我讀下一行我看到的服裝,則價值服裝是空的,所以我會在訂單類型值(服裝)傳遞給另一個表,並得到orderValue並追加到上面的XML獲得最終的XML

<customer> 
    <Grocery>10</Grocery 
    </Clothing>value from other table</Clothing> 
</customer> 

這就像從數據庫中獲取價值構建鍵值對。現在我的代碼使用datareader.getValues讀取一行的所有值並將其存儲在數組中。我試圖從數組中創建xml,但問題是xml沒有被添加,而是被覆蓋寫入。

using (OracleConnection conn = new OracleConnection(dbConnectionString)) 
     { 
      conn.Open(); 
      using (OracleCommand comm = new OracleCommand(query, conn)) 
      { 
       using (OracleDataReader dr = comm.ExecuteReader()) 
       { 
        while (dr.Read()) 
        { 
         Object[] values = new Object[dr.FieldCount]; 
         int fieldCount = dr.GetValues(values); 


         XElement xmlInput = 
             new XElement("Document", 
              new XElement(values[1].ToString(), values[0].ToString()) 
             ); 

          XElement xmlTree = new XElement("Document"); 

           foreach (XElement e1 in xmlInput.Elements()) 
           { 
            xmlTree.Add(new XElement("Document", 
             new XElement(columnName,rowValue))); 
           } 
           xmlInput.Add(xmlTree); 
         }  
        } 
       } 

      } 

那麼,如何在數據讀取器中讀取hey值對時如何追加xml?

回答

4

假設有一個名爲例如「allKeyValuePairs」密鑰值對的陣列,就可以很容易地創建,您張貼通過使用此代碼的XML結構:

XElement xmlDocument = new XElement("Customer"); 

foreach (KeyValuePair<string, string> singlePair in allKeyValuePairs) 
{ 
    xmlDocument.Add(new XElement(singlePair.Key, singlePair.Value)); 
} 

生成的XML將具有結構狀這樣的:

<Customer> 
    <Key1>Value1</Key1> 
    <Key2>Value2</Key2> 
    <Key3>Value3</Key3> 
    .... 
</Customer> 

你正在創建具有相同名稱的「文件」更多的元素,然後不停地在一個循環將它們添加到相同的根元素覆蓋它們。

+1

謝謝,這是有道理的。但有沒有辦法在我們讀取值時創建xml? –

+2

是的,在讀取新值時調用xmlDocument.Add添加新元素。只確保xmlDocument引用的是要添加值的相同對象。 –