2014-03-27 30 views
0

對此還沒有更具體的瞭解。我是C#的新手,需要創建一個應用程序來恢復我們的數據庫的一部分...通過數據表從XML節點到SQL的廣泛想法?

我有一系列單獨的XML文件,跨越幾個不同的文件夾。說\ FOLDER \ P_0001 \ P_000002.xml,然後\ FOLDER \ P_0002 \ P_000065.xml(初始文件夾總是相同,但P_000X文件夾的數量總是不同的,這些文件夾中包含多個XML文件

這裏是XML格式是需要被讀取。

<?xml version="1.0" encoding="utf-16"?> 
<EXAMS> 
    <EXAM id="15" majver="1" minver="1" width="1128" height="910"> 
    <NAME xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="string">Artefact reduced program</NAME> 
    <PATIENT id="2" /> 
    <OBJECTS> 
     <TAKE dbid="116" height="1280" width="2648"> 
     <VIEW majver="1" minver="2" maximized="0" x="0" y="122" width="1124" height="653" vx="199" vy="0" vWidth="2248" vHeight="1280" rotation="0" type="XP" regio="01" position="" orientation="" title="01XP 12.03.05: P1A, Ansicht Artefact reduced prog.." macroDbId="1" flippedHoriz="0" flippedVert="0" inverted="0" brightness="0" contrast="0" xPelsPerMeter="9259" yPelsPerMeter="9259" calibrated="0" calibrationFactor="1000"> 
      <PROPERTIES> 
      <PROPERTY name="NGDevicePluginData" value="" /> 
      <PROPERTY name="NGPostProcessing" value="" /> 
      <PROPERTY name="NGDoseValues" value="" /> 
      </PROPERTIES> 
      <DIAGNOSIS x="0" y="136" width="0" height="0" /> 
     </VIEW> 
     </TAKE> 
    </OBJECTS> 
    </EXAM> 
    <EXAM id="16" majver="1" minver="1" width="1128" height="910"> 
    <NAME xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="string">Ceph</NAME> 
    <PATIENT id="2" /> 
    <OBJECTS> 
     <TAKE dbid="120" height="2136" width="2808"> 
     <VIEW majver="1" minver="2" maximized="0" x="4" y="447" width="561" height="440" vx="2" vy="1" vWidth="2805" vHeight="2135" rotation="0" type="XC" regio="03" position="" orientation="" title="03XC 28.07.04: 30x23, Ansicht Ceph" macroDbId="1" flippedHoriz="0" flippedVert="0" inverted="0" brightness="0" contrast="0" xPelsPerMeter="9615" yPelsPerMeter="9615" calibrated="0" calibrationFactor="1000"> 
      <PROPERTIES> 
      <PROPERTY name="NGDevicePluginData" value="" /> 
      <PROPERTY name="NGPostProcessing" value="" /> 
      <PROPERTY name="NGDoseValues" value="" /> 
      </PROPERTIES> 
      <DIAGNOSIS x="4" y="460" width="0" height="0" /> 
     </VIEW> 
     </TAKE> 
     <TAKE dbid="121" height="2136" width="1756"> 
     <VIEW majver="1" minver="2" maximized="0" x="598" y="450" width="351" height="440" vx="1" vy="1" vWidth="1755" vHeight="2135" rotation="0" type="XC" regio="04" position="" orientation="" title="04XC 23.08.05: -, Ansicht Ceph" macroDbId="1" flippedHoriz="0" flippedVert="0" inverted="0" brightness="0" contrast="0" xPelsPerMeter="9615" yPelsPerMeter="9615" calibrated="0" calibrationFactor="1000"> 
      <PROPERTIES> 
      <PROPERTY name="NGDevicePluginData" value="" /> 
      <PROPERTY name="NGPostProcessing" value="" /> 
      <PROPERTY name="NGDoseValues" value="" /> 
      </PROPERTIES> 
      <DIAGNOSIS x="598" y="463" width="0" height="0" /> 
     </VIEW> 
     </TAKE> 
     <TAKE dbid="118" height="2136" width="1756"> 
     <VIEW majver="1" minver="2" maximized="0" x="1" y="2" width="351" height="440" vx="1" vy="1" vWidth="1755" vHeight="2135" rotation="0" type="XC" regio="01" position="" orientation="" title="01XC 02.09.04: -, Ansicht Ceph" macroDbId="1" flippedHoriz="0" flippedVert="0" inverted="0" brightness="0" contrast="-9" xPelsPerMeter="9615" yPelsPerMeter="9615" calibrated="0" calibrationFactor="1000"> 
      <PROPERTIES> 
      <PROPERTY name="NGDevicePluginData" value="" /> 
      <PROPERTY name="NGPostProcessing" value="" /> 
      <PROPERTY name="NGDoseValues" value="" /> 
      </PROPERTIES> 
      <DIAGNOSIS x="1" y="15" width="0" height="0" /> 
     </VIEW> 
     </TAKE> 
     <TAKE dbid="119" height="2136" width="1800"> 
     <VIEW majver="1" minver="2" maximized="0" x="358" y="1" width="360" height="440" vx="0" vy="1" vWidth="1800" vHeight="2135" rotation="0" type="XC" regio="03" position="" orientation="" title="03XC 02.09.04: -, Ansicht Ceph" macroDbId="1" flippedHoriz="0" flippedVert="0" inverted="0" brightness="0" contrast="0" xPelsPerMeter="9615" yPelsPerMeter="9615" calibrated="0" calibrationFactor="1000"> 
      <PROPERTIES> 
      <PROPERTY name="NGDevicePluginData" value="" /> 
      <PROPERTY name="NGPostProcessing" value="" /> 
      <PROPERTY name="NGDoseValues" value="" /> 
      </PROPERTIES> 
      <DIAGNOSIS x="358" y="14" width="0" height="0" /> 
     </VIEW> 
     </TAKE> 
    </OBJECTS> 
    </EXAM> 

什麼需要做的是閱讀的XML某些節點,然後將它們添加到不同的行中的SQL。問題是,名稱是不同的。假設XML中的「NAME」實際上是進入SQL中的TGroupRaw表中的tGrpSName ......

但是我迷路了。 ssume,我將首先以這種方式將XML讀入數據集。

string path = "C:\\PDATA\\P_0000\\P_000002.xml"; 
     DataSet ds = new DataSet(); 
     ds.ReadXml(path); 

然後,我需要找到一種方法將節點映射到不同的名稱,然後插入到SQL中。 當我完成並正常工作後,我可以找到一種方法來迭代所有單個XML文件,並對每個文件執行相同的操作。

但我迷失在此。已經在不同的事情上工作了大約一個月,並沒有任何線索。 有人可以給我一些建議,讓我開始?

順便說一句,我實際需要從XML文件中唯一的東西是患者id,名稱和考試ID。

+1

首先,我會完全忽略DataSet。這是舊技術,並且將你引向歧途。 –

+0

謝謝你們!這是完美的讓我開始。我不確定我會使用哪種方法,但我現在肯定正朝着正確的方向前進! – Redracer68

回答

1

選項A:

使用XDocument將xml映射到一些基本的DTO對象。

Parent/Children Xml to DTO Object Model with LINQ

選項B:

您可以直接在XML發送到存儲過程。

這裏有足夠的例子來向你展示如何將xml「分解」成行。

declare @doc xml 

select @doc= ' 

<EXAMS> 
    <EXAM id="15" majver="1" minver="1" width="1128" height="910"> 
     <NAME xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="string">Artefact reduced program</NAME> 
     <PATIENT id="2" /> 
     <OBJECTS> 
      <TAKE dbid="116" height="1280" width="2648"> 
       <VIEW majver="1" minver="2" maximized="0" x="0" y="122" width="1124" height="653" vx="199" vy="0" vWidth="2248" vHeight="1280" rotation="0" type="XP" regio="01" position="" orientation="" title="01XP 12.03.05: P1A, Ansicht Artefact reduced prog.." macroDbId="1" flippedHoriz="0" flippedVert="0" inverted="0" brightness="0" contrast="0" xPelsPerMeter="9259" yPelsPerMeter="9259" calibrated="0" calibrationFactor="1000"> 
        <PROPERTIES> 
         <PROPERTY name="NGDevicePluginData" value="" /> 
         <PROPERTY name="NGPostProcessing" value="" /> 
         <PROPERTY name="NGDoseValues" value="" /> 
        </PROPERTIES> 
        <DIAGNOSIS x="0" y="136" width="0" height="0" /> 
       </VIEW> 
      </TAKE> 
     </OBJECTS> 
    </EXAM> 
    <EXAM id="16" majver="1" minver="1" width="1128" height="910"> 
     <NAME xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="string">Ceph</NAME> 
     <PATIENT id="2" /> 
     <OBJECTS> 
      <TAKE dbid="120" height="2136" width="2808"> 
       <VIEW majver="1" minver="2" maximized="0" x="4" y="447" width="561" height="440" vx="2" vy="1" vWidth="2805" vHeight="2135" rotation="0" type="XC" regio="03" position="" orientation="" title="03XC 28.07.04: 30x23, Ansicht Ceph" macroDbId="1" flippedHoriz="0" flippedVert="0" inverted="0" brightness="0" contrast="0" xPelsPerMeter="9615" yPelsPerMeter="9615" calibrated="0" calibrationFactor="1000"> 
        <PROPERTIES> 
         <PROPERTY name="NGDevicePluginData" value="" /> 
         <PROPERTY name="NGPostProcessing" value="" /> 
         <PROPERTY name="NGDoseValues" value="" /> 
        </PROPERTIES> 
        <DIAGNOSIS x="4" y="460" width="0" height="0" /> 
       </VIEW> 
      </TAKE> 
      <TAKE dbid="121" height="2136" width="1756"> 
       <VIEW majver="1" minver="2" maximized="0" x="598" y="450" width="351" height="440" vx="1" vy="1" vWidth="1755" vHeight="2135" rotation="0" type="XC" regio="04" position="" orientation="" title="04XC 23.08.05: -, Ansicht Ceph" macroDbId="1" flippedHoriz="0" flippedVert="0" inverted="0" brightness="0" contrast="0" xPelsPerMeter="9615" yPelsPerMeter="9615" calibrated="0" calibrationFactor="1000"> 
        <PROPERTIES> 
         <PROPERTY name="NGDevicePluginData" value="" /> 
         <PROPERTY name="NGPostProcessing" value="" /> 
         <PROPERTY name="NGDoseValues" value="" /> 
        </PROPERTIES> 
        <DIAGNOSIS x="598" y="463" width="0" height="0" /> 
       </VIEW> 
      </TAKE> 
      <TAKE dbid="118" height="2136" width="1756"> 
       <VIEW majver="1" minver="2" maximized="0" x="1" y="2" width="351" height="440" vx="1" vy="1" vWidth="1755" vHeight="2135" rotation="0" type="XC" regio="01" position="" orientation="" title="01XC 02.09.04: -, Ansicht Ceph" macroDbId="1" flippedHoriz="0" flippedVert="0" inverted="0" brightness="0" contrast="-9" xPelsPerMeter="9615" yPelsPerMeter="9615" calibrated="0" calibrationFactor="1000"> 
        <PROPERTIES> 
         <PROPERTY name="NGDevicePluginData" value="" /> 
         <PROPERTY name="NGPostProcessing" value="" /> 
         <PROPERTY name="NGDoseValues" value="" /> 
        </PROPERTIES> 
        <DIAGNOSIS x="1" y="15" width="0" height="0" /> 
       </VIEW> 
      </TAKE> 
      <TAKE dbid="119" height="2136" width="1800"> 
       <VIEW majver="1" minver="2" maximized="0" x="358" y="1" width="360" height="440" vx="0" vy="1" vWidth="1800" vHeight="2135" rotation="0" type="XC" regio="03" position="" orientation="" title="03XC 02.09.04: -, Ansicht Ceph" macroDbId="1" flippedHoriz="0" flippedVert="0" inverted="0" brightness="0" contrast="0" xPelsPerMeter="9615" yPelsPerMeter="9615" calibrated="0" calibrationFactor="1000"> 
        <PROPERTIES> 
         <PROPERTY name="NGDevicePluginData" value="" /> 
         <PROPERTY name="NGPostProcessing" value="" /> 
         <PROPERTY name="NGDoseValues" value="" /> 
        </PROPERTIES> 
        <DIAGNOSIS x="358" y="14" width="0" height="0" /> 
       </VIEW> 
      </TAKE> 
     </OBJECTS> 
    </EXAM> 
</EXAMS> 
' 

;WITH XMLNAMESPACES('urn:schemas-microsoft-com:datatypes' AS peanut) 
SELECT 
     EXAM_ID =   Y.i.value('(../../../../../@id)[1]', 'varchar(40)') 
    , DATATYPE_DT =  Y.i.value('(../../../../../NAME/@peanut:dt)[1]', 'varchar(40)') 
    , PATIENT_ID =  Y.i.value('(../../../../../PATIENT/@id)[1]', 'varchar(40)') 
    , PROPERTY_NAME = Y.i.value('@name[1]', 'varchar(40)') 
    , PROPERTY_VALUE = Y.i.value('@value[1]', 'varchar(40)') 
    , DIAGNOSIS_X =  Y.i.value('(../../DIAGNOSIS/@x)[1]', 'varchar(40)') 
FROM 
    @doc.nodes('/EXAMS/EXAM/OBJECTS/TAKE/VIEW/PROPERTIES/PROPERTY') AS Y(i) 
2

從概念上講,我認爲你有大部分解決方案。 將XML文件讀取到XML文檔中:該對象將您的文件轉換爲「樹」格式。

然後使用閱讀器的各種功能重新生成(迭代)生成的樹。在此過程中,您可以跳過處理您不關心的節點,並使用SQL更新數據庫。

順便說一句,你的XML樣本(在這個問題)的格式不正確 - 它缺少封閉「的考試」標籤;]

這裏的代碼片段,顯示你需要什麼要點:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Program p = new Program(); 
      p.parse(); 
     } 


     XmlDocument xmldoc = new XmlDocument(); 

     public void parse() 
     { 
      xmldoc.Load("c:\\yourfile.xml");//load your XML file 

      //set your starting point 
      XmlNodeList xNodelset = xmldoc.DocumentElement.SelectNodes("EXAM"); 

      // traverse the XML 
      foreach (XmlNode xNode in xNodelset) 
      { 
       //here's where all the work is done: you can go over nodes, get their value 


       //get the exam id attribute: 
       int examID = int.Parse(xNode.Attributes[0].Value); 

       //and eventually push them to your DB using SQL. 
      } 
     } 
    } 


} 
+0

我將遠離'XmlDocument'並使用LINQ to XML來代替。它更靈活,更易於使用。 –

+0

我發現XmlDocument - 儘管非常冗長 - 比LINQ更直觀。來自其他語言的.Net程序員不一定需要學習lambda表達式來解析XML。 – FuzzyAmi

+0

首先,_real_程序員最好習慣lambda表達式 - 即使Java有它們。其次,我通常不需要使用lambda表達式來使用LINQ to XML。 –