tags:

views:

45

answers:

3

I've been given a collection of related xsd files and a spreadsheet with xpath information in it. I need to create an xml file conforming to the schema files and populate it with data from a database.This will be my first time delving into the XML classes in the .NET framework.

Which classes will help me get to my destination the quickest?

The data from the database can easily exceed 10000 records so memory and IO performance are also an issue.

A: 

Last I checked, the fastest way to execute XPath was using a compiled expression on an instance of XPathDocument.

If you're going to create it in-memory and query it, I suggest XmlDocument instead, since it's not read-only. If you're going to create it and write it to disk for later reading, just use XmlWriter directory. Obviously, you don't want to use any form of string concatenation, regardless.

Steven Sudit
A: 

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

I'd start here. This should point you in the right direction. The bulk of the heavy lifting you'll have to to do will be getting the information out of the DB into your Object instance.

Ian Jacobs
I went with serialization. I'm using an ORM to retrieve the data from the database. The my domain model and the xml schema don't line up perfectly so I used a builder pattern to simplify filling the serialized data object from my domain object.
codeelegance
A: 

I would use a dataset in your case. Like this example:

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>
nmiranda
If I understand correctly, DataSets are heavier than even XmlDocument.
Steven Sudit