Click here to Skip to main content
Email Password   helpLost your password?

Go to the CodePlex Project Site for the latest releases and source code.

XmlExplorer Window with the XPath Expression Results Window

Contents

Introduction

At work, I find myself constantly having to view XML files. Some of the files I work with are extremely large (150MB+). Internet Explorer and Firefox take forever to open these files. I like the way Visual Studio 2005 provides the ability expand/collapse individual elements, collapse or expand the entire document, etc, but it doesn't handle large files well either. Even the extremely expensive Stylus Studio chokes on the large files, and doesn't offer the features of VS2005.

I explored several open-source solutions, including ones from Code Project, but most of them were not fast enough. Most loaded the entire document into a tree, all at once.

This article discusses my solution to the problem. I ended up with a nice little utility that gets used extensively around the office. It is an extremely fast, lightweight XML file viewer. It's supports multiple document tabs, with support for middle-clicking to close tabs. It can handle extremely large XML files. It has been tested on files as big as 150MB. It allows fast viewing and exploration, copying of formatted XML data and evaluation of XPath expressions.

Background

My original implementation was based on the .NET XmlDocument. It was fast enough, but I didn't need any of the edit capabilities it offers. A colleague of mine, Mark (Code6) Belles, was kind enough to point me in the direction of the XPathDocument. XPathDocuments are even faster and use much less memory than the XmlDocument, at the expense of the modification functionality.

According to MSDN, the XPathDocument "provides a fast, read-only, in-memory representation of an XML document using the XPath data model". Sounded good to me.

Using the code

I've included several different ways to use the TreeView.

The XPathNavigatorTreeView can be added to your own forms via the designer in VS. Then, in code, just set the Navigator property of the XPathNavigatorTreeView to a XPathNavigator you've already loaded, for example:

// load the XPathDocument
XPathDocument document = new XPathDocument(_filename);

// set the Navigator property of the XPathNavigatorTreeView
this.xmlTreeView.Navigator = document.CreateNavigator();

The XmlExplorerTabPage, can be programmatically added to any standard TabControl.

// create a tab page
XmlExplorerTabPage tabPage = new XmlExplorerTabPage();

// add the tabpage to the tab control
this.tabControl.TabPages.Add(tabPage);

// instruct the tab to open the specified file.
tabPage.Open(filename);

The TabbedXmlExplorerWindow can be shown, in process, from your own applications.

// create a new application window
TabbedXmlExplorerWindow window = new TabbedXmlExplorerWindow();

// instruct the window to open a specified file
window.Open(filename);

// show the window
window.Show();

The XmlExplorer sample project is a fully-functional, standalone Windows application you can use to quickly view even extremely large XML files.

Points of Interest

The XPathNavigatorTreeView

One point of interest for the XPathNavigatorTreeView is the way TreeNodes are loaded on-demand, instead of loading nodes for every element in the document at once. Each node gets added with an empty 'dummy' node, so it can be expanded. I then override the OnBeforeExpand method, remove the dummy node, and add nodes for any child XML elements. Each node has a property to track whether it's been expanded and loaded, so it only gets loaded once.

I then use the XPathNavigator of an expanded tree node to select the child XML elements, returning an XPathNodeIterator. I use the iterator to add TreeNodes for the child XML elements, cloning the navigator for each node to maintain a cursor for future expansion.

// select the child nodes of the specified xml tree node
XPathNodeIterator iterator = treeNode.Navigator.SelectChildren(XPathNodeType.All);

// create and add a node for each navigator
foreach (XPathNavigator navigator in iterator)
{
    XPathNavigatorTreeNode node = new XPathNavigatorTreeNode(navigator.Clone());
    treeNodeCollection.Add(node);
}

The XPathNavigatorTreeNode

The implementation of the XPathNavigatorTreeNode is pretty straightforward. Here is how I construct the text for the node:

/// <summary>
/// Returns the text used to display this XPathNavigatorTreeNode, formatted using the XPathNavigator it represents.
/// </summary>
/// <returns />
public string GetDisplayText()
{
    if (_navigator == null)
        return string.Empty;

    StringBuilder builder = new StringBuilder();
    switch (_navigator.NodeType)
    {
        case XPathNodeType.Comment:
            // comments are easy, just append the value inside  tags
            builder.Append("");
            break;

        case XPathNodeType.Root:
        case XPathNodeType.Element:
            // append the start of the element
            builder.AppendFormat("<{0} ", _navigator.Name);

            // append any attributes
            if (_navigator.HasAttributes)
            {
                // clone the node's navigator (cursor), so it doesn't lose it's position
                XPathNavigator attributeNavigator = _navigator.Clone();
                if (attributeNavigator.MoveToFirstAttribute())
                {
                    do
                    {
                        builder.AppendFormat("{0}=\"{1}\" ", attributeNavigator.Name, attributeNavigator.Value);
                    }
                    while (attributeNavigator.MoveToNextAttribute());
                }
            }

            // if the element has no children, close the node immediately
            if (!_navigator.HasChildren)
            {
                builder.Append("/>");
            }
            else
            {
                // otherwise, an end tag node will be appended by the XPathNavigatorTreeView after it's expanded
                builder.Append(">");
            }
            break;

        default:
            // all other node types are easy, just append the value
            // strings, whitespace, etc.
            builder.Append(this.StripNonPrintableChars(_navigator.Value));
            break;
    }
    return builder.ToString();
}

Loading XML files asynchronously

As fast as the XPathDocument can load large XML files, I still wanted the UI to remain responsive, and even allow the user to cancel the loading of a file. I implemented the methods used to load the files in an asynchronous manner, using the .NET Thread class.

/// <summary>
/// Begins loading an XML file on a background thread.
/// </summary>
private void BeginLoadFile()
{
    _loadFileThread = new Thread(new ThreadStart(this.LoadFile));
    _loadFileThread.IsBackground = true;
    _loadFileThread.Start();
}

/// <summary>
/// The background worker method used to load an XML file in the background.
/// </summary>
private void LoadFile()
{
    try
    {
        if (this.LoadingFileStarted != null)
            this.LoadingFileStarted(this, EventArgs.Empty);

        Debug.WriteLine(string.Format("Peak RAM Before......{0}", Process.GetCurrentProcess().PeakWorkingSet64.ToString()));
        Debug.Write("Loading XPathDocument.");
        DateTime start = DateTime.Now;

        // load the document
        XPathDocument document = new XPathDocument(_filename);

        Debug.WriteLine(string.Format("Done. Elapsed: {0}ms.", DateTime.Now.Subtract(start).TotalMilliseconds));

        // the UI has to be updated on the thread that created it, so invoke back to the main UI thread.
        MethodInvoker del = delegate()
        {
            this.LoadDocument(document);
        };

        this.Invoke(del);

        if (this.LoadingFileCompleted != null)
            this.LoadingFileCompleted(this, EventArgs.Empty);
    }
    catch (ThreadAbortException ex)
    {
        // do not display the exception to the user, as they most likely aborted the thread by
        // closing the tab or application themselves
        Debug.WriteLine(ex);
        if (this.LoadingFileFailed != null)
            this.LoadingFileFailed(this, EventArgs.Empty);
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex);

        MethodInvoker del = delegate()
        {
            MessageBox.Show(this, ex.ToString());
        };

        this.Invoke(del);

        if (this.LoadingFileFailed != null)
            this.LoadingFileFailed(this, EventArgs.Empty);
    }
}

/// <summary>
/// Loads an XPathDocument into the tree.
/// </summary>
private void LoadDocument(XPathDocument document)
{
    try
    {
        if (document == null)
            throw new ArgumentNullException("document");

        Debug.Write("Loading UI.");
        DateTime start = DateTime.Now;
        this.xmlTreeView.Navigator = document.CreateNavigator();
        Debug.WriteLine(string.Format("Done. Elapsed: {0}ms.", DateTime.Now.Subtract(start).TotalMilliseconds));
        Debug.WriteLine(string.Format("Peak RAM After......{0}", Process.GetCurrentProcess().PeakWorkingSet64.ToString()));
    }
    catch (ThreadAbortException)
    {
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex);
        MessageBox.Show(this, ex.ToString());
    }
}

Settings

The sample application also saves and restores user settings (such as window position, size, font, etc) using the standard .NET Settings class. I used the excellent visual settings designer in Visual Studio 2005 (just double-click the Properties node under your project, then go to Settings). I made all of the settings user-specific, so different users of the same machine can use different settings. The settings can be accessed and saved with the following code:

// load the WindowState setting
window.WindowState = Properties.Settings.Default.WindowState;

...

// save the settings
Properties.Settings.Default.Save();

Performance

I've compared the times required to load XML files of varying size. XML Notepad was used for comparison, since it's nice enough to provide load times in the status bar. I realize the comparison isn't exactly fair, as XML Notepad is an XML editor. I trust you will find a place in your XML toolbox for both applications, as I have.

File Size XML Notepad XML Explorer
47.4 MB 48.68 seconds 4.94 seconds
31.3 MB 18.46 seconds 3.63 seconds
30.96 MB 16.47 seconds 2.89 seconds
3.69 MB 1.55 seconds .32 seconds
281 KB .35 seconds .04 seconds

As you can see, the difference is greatest on extremely large files. On the more normal sized files, the difference is barely noticeable.

Memory

XML Explorer also makes much more efficient use of RAM, by utilizing XPathDocument (instead of XmlDocument), and by loading the XML document into the display on-demand.

File Size XML Notepad XML Explorer
47.4 MB 563.3 MB RAM 126.1 MB RAM
31.3 MB 322.98 MB RAM 73.92 MB RAM
3.69 MB 51.87 MB RAM 14.04 MB RAM
281 KB 12.87 MB RAM 6.85 MB RAM

Future Enhancements 

I would like to add the ability to edit, but it would likely come at the expense of speed and memory usage.  I'm pretty happy using Visual Studio to edit XML files, and using XML Explorer for what it's best at.  I may dedicate some time to adding edit capabilities in the future.

I will likely be adding XSL transformation in the near future. 

Syntax highlighting and the ability to launch the XML editor of your choice were added in the 1.1 release. 

The 2.0 release is now available, containing the following changes:

You can get it, and the code, over at the CodePlex project page. Still haven't had the time to update the article (or write a part 2).

You must Sign In to use this message board.
 
 
Per page   
 FirstPrevNext
GeneralTags highlight [modified]
Victor Lapin
10:56 1 Oct '09  
Hi Jason. I've discovered your great application recently and I'm planning to use it in my project for showing a result of SQL query as XML.

I'd like to use tags highlight as you implemented in version 2.0. But then I'm forced to provide a docking library along with XmlExplorer.Controls.dll only to make it work. I won't use any tabbed or docked windows, I just need XPathNavigatorTreeView. So maybe you can upload its sources or at least some code snippet, which would be useful for me to implement highlighting myself?

Thanks.

modified on Friday, October 2, 2009 2:37 AM

GeneralRe: Tags highlight
Jason Coon
4:53 12 Oct '09  
Victor,

Sorry for the delay in responding. I haven't looked at this article in quite some time. I've moved development of this project to CodePlex.

http://xmlexplorer.codeplex.com

You can download the full source there. If all you want is the xml tree, you should be able to separate it from the rest of the project fairly easily. Let me know if you need further assistance.

Jason

GeneralRe: Tags highlight
Victor Lapin
5:37 12 Oct '09  
Yes, you are correct, I did just that. Thanks anyway.
Generaledit function
Jian1234567
9:17 17 Dec '08  
Hi, Jason

If I would like to add edit features, do you have any suggestions?
Thanks,

Jian
GeneralHow to use namespace manager
Guillaume Hanique
9:51 15 Sep '08  
Wow! Have been looking for such a program for a long time!

I had an xml file with prefixes it would not process. I modified the line

return node.Navigator.Evaluate(xpath);


in the file XPathNavigatorTreeview.cs to:

// Get the namespaces
XPathNavigatorTreeNode root = this.GetRootXmlTreeNode();
IDictionary<string,> namespaces = root.Navigator.GetNamespacesInScope(XmlNamespaceScope.All);
XPathNavigator navigator = node.Navigator;
XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);
foreach (KeyValuePair<string,> i in namespaces)
{
manager.AddNamespace(i.Key, i.Value);
}

// evaluate the expression, return the result
return node.Navigator.Evaluate(xpath, manager);


It now reads the prefixes from the root element and uses them in the XPath Navigator.
GeneralFails on Namespace even on 1.1.2 Release
vkanna
9:54 31 Oct '07  
The software fails on xPath query when XML file has namespace info in it.

Here is xml file, which loads fine but fails on xPath query and this happens even on latest 1.1.2 release downloaded from CodePlex [xpath query = /NorthwindDataSet/Customers/CustomerID]

'------------------
<?xml version="1.0" standalone="yes"?>
<NorthwindDataSet xmlns="http://tempuri.org/NorthwindDataSet.xsd">
   <Customers>
      <CustomerID>ALFKI</CustomerID>
      <CompanyName>Alfreds Futterkiste</CompanyName>
      <ContactName>Maria Anders</ContactName>
      <ContactTitle>Sales Representative</ContactTitle>
      <Address>Obere Str. 57</Address>
      <City>Berlin</City>
      <PostalCode>12209</PostalCode>
      <Country>Germany</Country>
      <Phone>030-0074321</Phone>
      <Fax>030-0076545</Fax>
   </Customers>
</NorthwindDataSet>
'-------------------

GeneralNice app - Added REST Support
xph!
8:24 10 Aug '07  
I am working on a new rest API for our product, and was looking to build a better test app than IE Smile

So... I took your code, and switched up the file name to a URI, added the file location to a combo box on the toolbar (like IE) and added a Verb drop down, for setting the request type...

You can now HEAD or GET from a URL, which approximates File Open, and you can PUT POST or DELETE a current document to the specified URI..

I hacked this in in a couple of hours, so it could be better integrated, and I am sure its buggy but working...

contact me through my web site, and I can work on getting the code back to you
http://blog.danbartels.com

For the PUT and POST support, it would be really great if I could edit just basic XML bits from the UI, Id really like to know more about the changes you had in mind to accomplish this.. I can envision the code to change the XML doc, but I don't know how you would tie it to say a double click in the XML document window to select what you wanted to edit. (read not a winforms developer)

Dan
GeneralFxCop
Koen Vingerhoets
0:00 31 Jul '07  
Hi,

thanks for the updates in XML Explorer. While integrating the latest version in my application, FxCop reported quite a lot of issues.
To give an example, you have the var filename instead of fileName. You only miss the casing in filename.
Could you please give FxCop a run over your source?

Thanks,

Koen

I am drunk of Borg. Resistance is floor tile.

GeneralInterface enabled state confusing!
Koen Vingerhoets
3:28 24 Jul '07  
Hi,

my colleagues complained about the interface. On second thought, it's indeed confusing.
After opening "File", I have to click "File" again so I can copy XPath queries.
Furthermore, despite the comment regarding redundant code
// wire up all of the toolbar and menu events
// where applicable, I wire the click events of multiple tools to the same event handler
// to reduce redundant code (for example, for the Open menu item and the Open toolbar button).

there's a heap, at least concerning the interface.

Please take a look at the following:

// wire up all of the toolbar and menu events
// where applicable, I wire the click events of multiple tools to the same event handler
// to reduce redundant code (for example, for the Open menu item and the Open toolbar button).
this.toolStripMenuItemFile.DropDownOpening += this.OnToolStripMenuItemOpening;
this.toolStripMenuItemView.DropDownOpening += this.OnToolStripMenuItemOpening;
this.toolStripMenuItemEdit.DropDownOpening += this.OnToolStripMenuItemOpening;
this.toolStripMenuItemFormat.DropDownOpening += this.OnToolStripMenuItemOpening;
ValidateMenuStrip();

with
        private void ValidateMenuStrip()
{
try
{
foreach (ToolStripMenuItem tsmi in menuStripMain.Items)
{
if (tsmi.Name == this.toolStripMenuItemFile.Name)
continue;
foreach (ToolStripItem o in tsmi.DropDownItems)
{
o.Enabled = (this.tabControl.TabPages.Count > 0);
}
}
}
catch (Exception ex)
{
Debug.WriteLine(ex);
MessageBox.Show(this, ex.ToString());
}
}

private void OnToolStripMenuItemOpening(object sender, EventArgs e)
{
ValidateMenuStrip();
}


This way is not only more effective, it's also way less code and open for extension.
ValidateMenuStrip(); is called after initializing the GUI, and in each dropdown event.
It's of course possible to tweak more and also disable the save functions, but I noticed they have their own validation routine already.

Thanks,

Koen



I am drunk of Borg. Resistance is floor tile.

GeneralRe: Interface enabled state confusing!
Jason Coon
4:08 24 Jul '07  
Koen,

Thanks for catching that, I'm surprised I haven't heard about that yet. I'll get it fixed and update the source and the article.

If you have any other problems, questions, or suggestions, feel free to post them over at the CodePlex project page.

Thanks,

Jason

GeneralLicense - integration
Koen Vingerhoets
23:18 23 Jul '07  
Hi,
First of all: the application works great. It's refreshing to see load times. As I work on a program that uses large xml files to update a database, this tool outperforms XMLSpy man times.

I transform in c# xls/csv/whatever files to xml, so formatting is gone. With this tool, my not so pc savvy colleagues are able to read the xml, and save it with formatting. Then they can alter the data (HR - changes every second it seems =s) in UltraEdit. Since all files are stored in specified paths, I made, using the source code, XML Explorer a part of my program (I did loose MDI functionalityFrown

Doing that however, I ran into the following text in the ToolStripSpringTextBox:
// ============================================================================
//
// This file is a part of the Secure Passage codebase. The contents of
// this file are confidential and cannot be distributed without prior
// written authorization.
//
// Copyright © 2000-2005 Secure Passage All rights reserved.
//
// Warning: This computer program is protected by copyright law and
// international treaties. Unauthorized reproduction or distribution of
// this program, or any portion of it, may result in severe civil and
// criminal penalties, and will be prosecuted to the maximum extent
// possible under the law.
//
// ============================================================================


To what extent is that license applicable? Am I allowed to modify source and/or use the program? Confused

Thanks

Koen

I am drunk of Borg. Resistance is floor tile.

AnswerRe: License - integration
Jason Coon
4:01 24 Jul '07  
Koen,

Thanks for the feedback, I'm glad you're finding the app useful. Please disregard the copyright notice. I will take care of that as soon as I can. I developed the app myself, on my own time, and with my own resources. It is used extensively at my work place, and I received authorization from my employer to post the article.

Thanks,

Jason

GeneralSuggestion
yavor nenov
5:33 19 Jul '07  
It is really a nice tool. It would be nice though one to be able to copy the path from the root element to the selected node - the one shown in the status bar.
AnswerRe: Suggestion [modified]
Jason Coon
6:20 19 Jul '07  
You can Smile The 'Edit'->'Copy Node Path to Address Bar' menu item or Ctrl-Alt-Shift keyboard shortcut will copy the currently selected node's path to the XPath bar. If you want to copy it elsewhere, you can copy it from the XPath bar.

I should have it also copy the path to the clipboard. Feel free to add any suggestions you have over at the project's CodePlex article on either the Discussions or the Issue Tracker page.

Thanks,


-- modified at 13:42 Thursday 19th July, 2007

Jason

GeneralRe: Suggestion
yavor nenov
6:45 19 Jul '07  
Sorry, my mistake Smile. Of course the clipboard option would be better but it saves quite time being as is.

Thanks,

Yavor Nenov

GeneralSecurity Exception while accessing commandline arguments on startup
Martin0815
5:08 16 Jul '07  
After building the XmlExplorer Project I tried to run it (Release), noticed the exception and retried with the Debug Version.

At the following code position ...

namespace XmlExplorer
{
using Microsoft.VisualBasic.ApplicationServices;
using System;
using System.Collections;
using System.Collections.ObjectModel;
using System.Windows.Forms;
using System.Diagnostics;

...

public class SingleInstanceApplication : WindowsFormsApplicationBase
{
public virtual void Run(Form mainForm)
{
base.MainForm = mainForm;
this.Run(base.CommandLineArgs);
}
}
}

... I got following exception:

System.Security.SecurityException was unhandled
Message="Request for the permission of type 'System.Security.Permissions.EnvironmentPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed."
Source="mscorlib"
StackTrace:
at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
at System.Security.CodeAccessPermission.Demand()
at System.Environment.GetCommandLineArgs()
at Microsoft.VisualBasic.ApplicationServices.ConsoleApplicationBase.get_CommandLineArgs()
at XmlExplorer.SingleInstanceApplication.Run(Form mainForm)
at XmlExplorer.Program.Main(String[] args)
at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.runTryCode(Object userData)
at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

I don't know enough about what's going on there, while asking for commandline args, so ... I'm not able to tell you more.

I hope you can work this out. If I should test something, than please contact me!

Best regards,

Martin
GeneralRe: Security Exception while accessing commandline arguments on startup
Mark (Code6) Belles
7:32 16 Jul '07  
Thank you for finding this. What version of Windows are you running on? Are you running this from a file share or terminal server?

Si vic pacem para bellum - If you want peace, prepare for war

GeneralRe: Security Exception while accessing commandline arguments on startup
Martin0815
7:56 16 Jul '07  
Hi,

answering your questions:

1. MS Windows XP Professional (Version 2002, SP2)
2. From a mapped Network-Drive

I tried to start XmlExplorer from the "real" directory and it worked.

Best regards,

Martin
GeneralRe: Security Exception while accessing commandline arguments on startup
Mark (Code6) Belles
9:44 16 Jul '07  
Thanks for the feedback.

The current implementation does not support execution from anywhere but the local file system. There are small changes to the code to allow it to run as a ClickOnce application that could be implemented, however I am to blame for Jason's current architecture.

Using the streams provided by the OpenFileDialogs to comply with the ClickOnce architecture, limit your ability to save files (needed for reformatting the xml, or just to save a new snippet), and accessing useful information like the file name (for tab names and other niceties).

I believe there are likely other ways around this (using CAS), but during the course of our testing I convinced him it we didn't need it to support running from anywhere but the local file system.

Do you have need of running like this, or is it no big deal to run it from a local directory?

Si vic pacem para bellum - If you want peace, prepare for war

GeneralRe: Security Exception while accessing commandline arguments on startup
Martin0815
9:47 16 Jul '07  
No - there is no real need to run XmlExplorer not from the local file system.

I just tried to build and to run it from my local temp-directory share - that's all.
I wasn't aware of the CAS implications.

Keep on with your good work!

Best regards,

Martin
GeneralRe: Security Exception while accessing commandline arguments on startup
Mark (Code6) Belles
10:16 16 Jul '07  
Jason will likely come up with an easy fix, just as soon as I post this, so keep an eye out. He might have an idea of how to fix this, but I can't promise anything. Smile

Si vic pacem para bellum - If you want peace, prepare for war

AnswerRe: Security Exception while accessing commandline arguments on startup
Jason Coon
18:49 16 Jul '07  
Martin,

Yeah, Mark is exactly right. I tried this out myself, and get several different SecurityExceptions (can't even access the command-line arguments!).

I've surrounded the offending code with exception handlers, and fallen-back to more secure methods. This will mean, when launching from a network or internet location, no command-line arg handling, no drag-drop, and no saving with formatting. Eventually, I'll likely add a Click-Once enabled implementation (Click-Once can now handle command-line args).

I still need to work around opening files without access to the OpenFileDialog.Filenames property (using the OpenFile method). I'll get this tested and update the code and article, hopefully in the next few days.

Thanks,

Jason

QuestionQuick question
Ed.Poore
5:52 11 Jul '07  
May I ask what an earth you're doing working with 150MB XML files?  I can think of some reasons but then can come up with arguments against them... Unsure



AnswerRe: Quick question
jcoon
8:26 11 Jul '07  
It's an extreme case, to be sure, and one we try to avoid. I can't go into detail, but it's a file format that can grow very large in certain environments. We're working on the proper way to split them up. The point is that they exist, and trying to open one in IE, Firefox, Visual Studio, etc is an exercise in patience. Smile

Jason

GeneralRe: Quick question
Ed.Poore
9:27 11 Jul '07  
jcoon wrote:
etc is an exercise in patience.

So something useful comes out the end of it then Poke tongue
jcoon wrote:
but it's a file format that can grow very large in certain environments

Imagine doing an XSLT on it Eek!




Last Updated 11 Sep 2008 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2010