2011-08-19 143 views
0

我想爲用戶提供一個類似於XML結構(這裏是一個完整的信息表單)的可視化DOM,並允許它們指定他們想要映射到的xml數據的哪些元素一個靜態編譯的對象。動態地將xml字段映射到一個靜態對象

作爲一個例子,用戶有一個infopath表單,允許他們輸入銷售交易,填寫並提交,應用程序應允許他們查看infopath表單中的數據結構(在友好,樹視圖方式),並指定它應該如何映射到銷售交易的靜態表示(考慮可能在「交易」表中出現的行)。

Infopath窗體(xml源代碼)不受我控制。

我在尋找關於如何顯示XML樹形視圖的建議,並允許與它交互以指定映射(可能是拖放?)。

這將在一個wpf應用程序(我知道我將不得不在一個表單主機中託管infopath控件,因爲它不是wpf),我們希望使用Microsoft提供的.Net元素或開源軟件。

編輯:作爲一個更詳盡的例子,假設有導致XML的InfoPath表單,看起來像:

<Deal id="1" dateBooked="2011-01-01" term="24" language="en-us"> 
    <Salesman>Jim Flowers</Salesman> 
    <FinancedAmount>55000.00</FinancedAmount> 
    <Items> 
     <Item id="1" quantity="10" unitPrice="10000.00">Tractor</Item> 
     <Item id="2" quantity="1" unitPrice="5000.00">Spare Blade</Item> 
    </Items> 
    <Notes> 
     <Note dateAdded="2010-09-20">Customer needs a spare blade</Note> 
     <Note dateAdded="2010-12-31">Customer wants to sign the deal on new year's day, I find this odd...</Note> 
</Deal> 

我希望用戶,在運行時,並以直觀的方式(用戶將不會知道xpath ...)將本文檔樹視圖的特定節點映射到「Deal」對象上的字段。因此,Deal對象可能有一個ID,銷售員,金額,項目集合等需要填充,但註釋和一些其他數據被忽略,並且表單將不會相同(信息路徑提供了可配置的表單用戶可以根據需要將數據導入系統)或以任何一致的方式命名。用戶正在指定映射。

回答

1

Andreas的解決方案看起來像是一個很好的第一步。看起來像你的輸入,它需要遞歸到節點的屬性中。

我你的計劃的描述是:

  1. 構建一個顯示所有的數據的控制(安德烈亞斯使用一個TreeView)
    • 你可能會想顯示的名稱和每個值
  2. 建立一個類似的控制要裝載到
  3. 設置事件建立映射對象
    • 你提到他們
    • 之間拖動或者,如果他們都複選框樹也許他們檢查一個XML樹,然後一個對象樹和復位兩個,建立映射的列表中創建
  4. 最後使用映射表來填充對象

我看不出有什麼簡單的方法來做到這一點,它的很多工作,很多它取決於執行的細節,所以我不能只是給你可以做到的代碼。通過XML

  1. 遞歸,你去對每一個值
  2. 加載所有的XPath和名稱和值生成的XPath:

    我怎麼覺得我可能這樣做是爲了得到它快速工作他們代表到表中要顯示給用戶

    • 隨着列「姓名」,「價值」,「XPath的」 -hidden,「加載到房產」 -dropdown
  3. 卜ild下拉列表中的每個屬性在你的對象中,在表中的一列中顯示給用戶

基本上我相信你需要把它分解成更小的步驟,並搜索每個特定步驟的幫助。

1

我會走最簡單的方式 - 從給定的XML創建一個樹視圖,並添加一個複選框到每個節點。當用戶單擊「確定」(或其他)按鈕時,您將檢查所有選中的複選框並構建您的對象。

創建從一個XML樹視圖是相當簡單 - 這應該工作

public static class TreeViewExtensions 
    { 
     public static void LoadXml(this TreeView treeview, XmlDocument doc) 
     { 
      treeview.Nodes.Clear(); 

      RecursiveImport(treeview.Nodes, doc.ChildNodes); 
     } 

     private static void RecursiveImport(TreeNodeCollection tvNodes, XmlNodeList xmlNodes) 
     { 
      TreeNode tvNode; 

      foreach (XmlNode xmlNode in xmlNodes) 
      { 
       tvNode = new TreeNode(xmlNode.Name); 

       if (xmlNode.ChildNodes.Count > 0) 
        RecursiveImport(tvNode.Nodes, xmlNode.ChildNodes); 

       tvNodes.Add(tvNode); 
      } 
     } 
    } 

編輯:嗯,基本上,你可以列出一個列表框中的所有XML字段,以及所有(我沒有然而測試一下吧!)你的對象在另一個領域。當用戶將拖放的1字段拖到對象的列表框中時,您需要將此關係保存在另一個對象中。

我不熟悉使用WPF但這篇文章似乎還不錯 - http://www.codeproject.com/KB/dotnet/csdragndrop01.aspx

「鏈接」枚舉類型查找試圖達到什麼非常有前途的。

+0

+1一個很好的答案,但不一定是我問的問題。我需要從文檔中任意命名的xml節點,我沒有指定映射到我指定的對象。映射是重要的部分。我會嘗試在編輯問題時更清楚地說明這一點。 – marr75

+0

更新了答案...希望我能更好地理解這次的要求;-) – int32

相關問題