我需要在C#Windows窗体应用程序的树视图控件中显示一个大型XML文件(> 21MB)。我编写了适用于小型XML文件的代码,但是当我尝试打开一个大的XML文件(> 1 MB)时,它花费了太多时间。 任何人都可以建议我如何优化这一点并建议我做出任何改变或替代方案。
以下是代码段:
private void CreateTreeViewFromATXML(string strSrcFileName)
{
XmlDataDocument xmldoc = new XmlDataDocument();
XmlNode xmlnode ;
FileStream fs = new FileStream(strSrcFileName, FileMode.Open, FileAccess.Read);
xmldoc.Load(fs);
xmlnode = xmldoc.ChildNodes[1];
XMLTreeView.Nodes.Clear();
XMLTreeView.Nodes.Add(new TreeNode(xmldoc.DocumentElement.Name));
TreeNode tNode ;
tNode = XMLTreeView.Nodes[0];
AddNode(xmlnode, tNode);
}
private void AddNode(XmlNode inXmlNode, TreeNode inTreeNode)
{
//XmlNode xNode ;
TreeNode tNode ;
XmlNodeList nodeList ;
int i = 0;
if (inXmlNode.HasChildNodes)
{
nodeList = inXmlNode.ChildNodes;
foreach (XmlNode XNode in inXmlNode.ChildNodes)
{
tNode = new TreeNode(XNode.Name);
inTreeNode.Nodes.Add(tNode);
AddNode(XNode, tNode);
}
}
else
{
inTreeNode.Text = inXmlNode.InnerText.ToString();
}
}
答案 0 :(得分:4)
我会像这样包装你的代码:
XMLTreeView.BeginUpdate();
try
{
CreateTreeViewFromATXML(strSrcFileName);
}
catch (Exception e)
{
//Handle any error
}
finally
{
XMLTreeView.EndUpdate();
}
如果您不在更新块中,则会在每个节点上重新绘制GUI,而且价格昂贵。您也可以在AddNode
中进行递归,但如果XML没有太深入嵌套,则不应该是一个问题。
答案 1 :(得分:1)
我建议使用XDocument和XML来更快地解析Linq。您可以使用以下代码来解析XML:
using System.Xml;
using System.Xml.Linq;
using System.Data;
XDocument xdoc = XDocument.Load(XMLFile);
var item = from items in xdoc.Element("EPICORTLOG").Descendants("POS")
where (string)items.Element("Id") == strSelectedPOSID
select items.Elements("TRADE").Elements("ITEM").ToList().ToList();
然后,您可以按照以下链接中的说明解析XML: http://www.dotnetcurry.com/showarticle.aspx?ID=564 上面的文章将解释XML到LINQ编程。使用上述方法,您可以在短时间内加载大小为10MB的XML文件。
答案 2 :(得分:0)
最近,我使用TreeView组件在C#中实现我的HTML编辑器,我使用序列化数据结构来提高打开和保存XML文件的性能。 根据我的经验,使用此结构并序列化读写文件可以在我的计算机中在2秒内打开最多20M的文件。此解决方案可以在我的C#应用程序中打开超过2G字节的XML文件。希望这个解决方案可以帮助您更好。
为TreeView和TreeNode定义Serializable结构的示例
[Serializable]
public class TreeViewData
{
public TreeNodeData[] Nodes;
public TreeViewData(){ }
public TreeViewData(TreeView treeview)
{
//your code
}
public TreeViewData(TreeNode treenode)
{
//your code
}
public void PopulateTree(TreeView treeview)
{
//your code
}
public void PopulateSubTree(TreeNode treenode)
{
//your code
}
}
[Serializable]
public class TreeNodeData
{
public string Text;
public int ImageIndex;
public int SelectedImageIndex;
public string Tag;
public TreeNodeData[] Nodes;
public TreeNodeData() {}
public TreeNodeData(TreeNode node)
{
// your code
}
public TreeNode ToTreeNode()
{
// your code
}
}
序列化读取XML文件的示例
System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(TreeViewData));
System.IO.FileStream file = new System.IO.FileStream(strFilename, FileMode.Open);
System.Xml.XmlTextReader reader = new System.Xml.XmlTextReader(file);
TreeViewData treeData = (TreeViewData)ser.Deserialize(reader);
treeData.PopulateTree(TreeView1);
序列化写入XML文件的示例
System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(TreeViewData));
System.IO.FileStream file = new System.IO.FileStream(strFilename, System.IO.FileMode.Create);
System.Xml.XmlTextWriter writer = new System.Xml.XmlTextWriter(file, null);
ser.Serialize(writer, new TreeViewData(TreeView1));