我有一个很大(〜40mb)的XML数据集合,在许多文件中没有很好地形成,因此我合并它们,添加一个根节点并加载所有xml在XmlDocument
。它基本上是3种不同类型的列表,可以用几种不同的方式嵌套。本实施例中应显示大多数情况下:单线程应用程序显示竞争状态,如行为
<Root>
<A>
<A>
<A></A>
<A></A>
</A>
</A>
<A />
<B>
<A>
<A>
<A></A>
<A></A>
</A>
</A>
</B>
<C />
</Root>
林通过使用上一个XmlDocument
(//A
,//B
,//C
),所得到的节点集转换为数据表,并显示一个XPath表达式中分离所有A,B和C的节点Datagridview中每个节点类型的所有节点的列表。这工作正常。
但现在我面临一个更大的文件,只要我加载它,它只显示我4行。然后我在实际的XmlDocument.SelectNodes
发生的行添加了一个断点,并检查了结果NodeSet
。它向我展示了大约25,000个条目。在继续加载程序并且哎呦,我所有的25k行都显示出来了。我试了一遍,我可以重现它。如果我手动跨越XmlDocument.SelectNodes,它就可以工作。如果我不打破那里,它不会。我不会在我的应用程序中产生单个线程。
如何进一步调试?要找什么?我已经经历了多线程库如jsch(ssh)的这种行为,但我不明白为什么这应该发生在我的情况。
非常感谢!
// class XmlToDataTable:
private DataTable CreateTable(NamedXPath logType,
List<XmlColumn> columns,
ITableCreator tableCreator)
{
// I have to break here -->
XmlNodeList xmlNodeList = logFile.GetEntries(logType);
// <-- I have to break here
DataTable dataTable = tableCreator.CreateTableLayout(columns);
foreach (XmlNode xmlNode in xmlNodeList)
{
DataRow row = dataTable.NewRow();
tableCreator.PopulateRow(xmlNode, row, columns);
dataTable.Rows.Add(row);
}
return dataTable;
}
// class Logfile:
public XmlNodeList GetEntries(NamedXPath e)
{
return (_xmlDocument != null && _xmlDocument.HasChildNodes)
? _xmlDocument.SelectNodes(e.XPath)
: new XmlNullObjectNodeList();
}
// _xmlDocument gets loaded here after reading all xml fragments into a string
// (ugly, i know. the // ugly! comment reminds me about that ;))
private void CreateXmlDoc()
{
_xmlDocument = new XmlDocument();
_xmlDocument.LoadXml(OPEN_ROOT_ELEMENT + _xmlString +
CLOSE_ROOT_ELEMENT);
if (DataChanged != null)
DataChanged(this, new EventArgs());
}
// class NamedXPath:
public abstract class NamedXPath
{
private readonly String _name;
private readonly String _xPath;
protected NamedXPath(string name, string xPath)
{
_name = name;
_xPath = xPath;
}
public string Name
{
get { return _name; }
}
public string XPath
{
get { return _xPath; }
}
}
你可以发布如何加载_xmlDocument?关于CreateTable的前言 – 2010-09-21 08:26:32
@Henk Holterman编辑我的文章。我读取字符串中的所有XML,添加和 并调用XmlDocument.LoadXml(String s)。我知道这很慢,吃了记忆,一旦它起作用,它就会被分析和调整。 –
atamanroman
2010-09-21 08:37:18
乍一看,你有一个很奇怪的问题。但是还有什么可能是相关的?空接收{}块?背景工作者? – 2010-09-21 08:47:23