2010-02-15 75 views
0

我已經收到了一組相關的xsd文件和一個包含xpath信息的電子表格。我需要創建一個符合模式文件的xml文件,並用數據庫中的數據填充它。這將是我第一次深入研究.NET框架中的XML類。開始在.NET中使用XML

哪些課程能幫助我最快到達目的地?

來自數據庫的數據很容易超過10000條記錄,所以內存和IO性能也是一個問題。

回答

0

http://msdn.microsoft.com/en-us/library/ms950721.aspx

我會從這裏開始。這應該指向你正確的方向。你必須做的大部分繁重工作將從DB中獲取信息到你的Object實例中。

+0

我去了序列化。我正在使用ORM從數據庫中檢索數據。我的域模型和xml模式並不完美,因此我使用了構建模式來簡化從我的域對象填充序列化數據對象。 – 2010-02-16 14:50:05

0

最後我檢查了,執行XPath的最快方法是在XPathDocument的一個實例上使用編譯表達式。

如果您要在內存中創建並查詢它,我建議使用XmlDocument,因爲它不是隻讀的。如果您要創建它並將其寫入磁盤供以後閱讀,請使用XmlWriter目錄。顯然,無論如何,你都不想使用任何形式的字符串連接。

0

我會在你的情況下使用數據集。像這個例子:

Imports System 
Imports System.Xml 
Imports System.Xml.Schema 
Imports System.IO 
Imports System.Drawing 
Imports System.Drawing.Drawing2D 
Imports System.Collections 
Imports System.Data 
Imports System.Windows.Forms 


Public Class MainClass 

    Shared Sub Main() 
     Dim DSStudentClasses As New DataSet() 
     Dim tmpNode As XmlNode 

     ' Load the schema into the DataSet 
     DSStudentClasses.ReadXmlSchema("StudentClasses.xsd") 

     ' Load the DataSet into the data document 
     Dim XDocStudents As New XmlDataDocument(DSStudentClasses) 

     ' Load the data into the data document 
     XDocStudents.Load("Students.xml") 

     Console.WriteLine("Students in DataSet:") 
     Dim Row As DataRow 
     For Each Row In DSStudentClasses.Tables("Student").Rows 
      Console.WriteLine("{0}:{1}", Row("Name"), Row("GPA")) 
      tmpNode = XDocStudents.GetElementFromRow(Row) 
      Console.WriteLine(_ 
        " Locker Combination (from XML, not DataSet): {0}", _ 
        tmpNode.SelectSingleNode("LockerCombination").InnerText) 

      Dim Subject As DataRow 
      For Each Subject In Row.GetChildRows("StudentClasses") 
       Console.WriteLine(" {0}", Subject("Title")) 
      Next 
     Next 
    End Sub 

End Class 

'student.xml 

'<?xml version="1.0" encoding="utf-8" ?> 
'<Students> 
' <Student ID="1"> 
' <Name>Joe Wang</Name> 
' <Age>30</Age> 
' <GPA>2.95</GPA> 
' <LockerCombination>10-12-35</LockerCombination> 
' <Class Title="Biology" Room="100" /> 
' <Class Title="English Lit" Room="101" /> 
' </Student> 
'</Students> 

'student.xsd 

'<?xml version="1.0" standalone="yes"?> 
'<xs:schema id="Students" xmlns="" 
'      xmlns:xs="http://www.w3.org/2001/XMLSchema"       xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
' <xs:element name="Students" msdata:IsDataSet="true"> 
' <xs:complexType> 
'  <xs:choice maxOccurs="unbounded"> 
'  <xs:element name="Student"> 
'   <xs:complexType> 
'   <xs:sequence> 
'    <xs:element name="Name" type="xs:string" 
'       minOccurs="0" msdata:Ordinal="0" /> 
'    <xs:element name="GPA" type="xs:float" 
'       minOccurs="0" msdata:Ordinal="2" /> 
'    <xs:element name="Class" 
'       minOccurs="0" maxOccurs="unbounded"> 
'    <xs:complexType> 
'     <xs:attribute name="Title" type="xs:string" /> 
'     <xs:attribute name="Room" type="xs:string" /> 
'     <xs:attribute name="StudentID" type="xs:int" 
'        use="prohibited" /> 
'    </xs:complexType> 
'    </xs:element> 
'   </xs:sequence> 
'   <xs:attribute name="ID" type="xs:int" /> 
'   </xs:complexType> 
'  </xs:element> 
'  </xs:choice> 
' </xs:complexType> 
' <xs:unique name="StudentID" msdata:PrimaryKey="true"> 
'  <xs:selector xpath=".//Student" /> 
'  <xs:field xpath="@ID" /> 
' </xs:unique> 
' <xs:keyref name="StudentClasses" refer="StudentID" 
'    msdata:IsNested="true"> 
'  <xs:selector xpath=".//Class" /> 
'  <xs:field xpath="@StudentID" /> 
' </xs:keyref> 
' </xs:element> 
'</xs:schema> 
+0

如果我理解正確,DataSet甚至比XmlDocument更重。 – 2010-02-15 19:42:08