【发布时间】:2017-05-06 22:17:28
【问题描述】:
在下面的代码中,我正在 XmlSchemaDocument 中搜索一个元素。如果元素是 XmlSchemaDocument 的一部分,则迭代工作得很好。
public void FindSchemaElement(string elementName, string dataType, List<XmlSchemaElement> allChildren, string parentName)
{
try
{
List<XmlSchemaElement> temp = new List<XmlSchemaElement>();
temp.AddRange(allChildren);
foreach (XmlSchemaElement e in allChildren)
{
if (e.Name != elementName && e.RefName.Name != elementName &&
(dataType == "" || e.SchemaTypeName.Name != dataType)) continue;
if (e.Parent == null || e.Parent is XmlSchema)
{
ElementToBeFound = e;
return;
}
var parent = e.Parent;
while (parent != null && parent.GetType() != typeof(XmlSchemaElement))
parent = parent.Parent;
if (parent != null && ((XmlSchemaElement) parent).Name == parentName)
{
ElementToBeFound = e;
return;
}
if (parent == null || parent.GetType() == typeof(XmlSchema)) ElementToBeFound = e;
}
if (ElementToBeFound != null) return;
_childrenList.Clear();
if (temp.Count > 0)
GetNextChildren(temp, dataType, elementName, parentName);
}
catch(Exception exception){Debug.WriteLine("FindSchemaElement: "+exception.Message);}
}
得到孩子:
private void GetNextChildren(List<XmlSchemaElement> allChildren, string dataType, string elementName, string parentName = "")
{
try
{
foreach (XmlSchemaElement e in allChildren)
GetChildren(e);
if (parentName != string.Empty)
FindSchemaElement(elementName, dataType, _childrenList, parentName);
else
FindSubsGroups(elementName, dataType, _childrenList);
}
catch (Exception ex)
{ Debug.WriteLine("GetNextChildren: " + ex.Message); }
}
在 GetChildren() 中 - 我只是检查元素的类型(序列、选择元素),如果它是一个元素,我会将其添加到 _childrenList。
但是,如果找不到该元素,我会陷入循环,最终内存不足(我使用的 .xsd 文件非常大)。 我注意到只有在 .xsd 中存在循环时才会出现此问题 - 如图所示: 有没有办法在没有找到元素但是有这样一个循环的时候停止迭代?
【问题讨论】:
-
循环中有
break关键字用于停止迭代。 -
我知道.. 但是我怎么知道什么时候需要停止循环呢?我需要确保所有元素都已检查,然后我可以停止循环。
-
函数
GetChildren和FindSubsGroups有什么作用?你也可以发一下吗? -
在 GetChildren() 中 - 我只是检查元素的类型(序列、选择元素),如果它是一个元素,我会将其添加到 _childrenList。
-
对于子组,我只是获取同一子组的元素。
标签: c# loops xsd out-of-memory xmldocument