开发者

Getting started working with XML in .NET

开发者 https://www.devze.com 2022-12-20 10:26 出处:网络
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

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 d开发者_运维知识库atabase can easily exceed 10000 records so memory and IO performance are also an issue.


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.


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>


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消