需要有关调试 c# XML-解析的帮助
need help on debug c# XML-parsing
我的 C# 代码使 VisualStudio (2013) 在使用整个 XML 文件时没有响应(189 个描述符,每个描述符有 64 个特征),但少量运行良好
Matrix<float> ObjectDescriptors = new Matrix<float>(200, 64);
XmlTextReader reader = new XmlTextReader("descriptors.xml");
int i = -1;
int ii = 0;
while (reader.Read())
{
if (reader.Name == "feature" && ii < 64)
{
ObjectDescriptors[i, ii] = reader.ReadElementContentAsFloat();
ii++;
if (ii == 64) ii = 0;
}
else if (reader.Name == "descriptor") i++;
}
XML 数据干净。有谁知道为什么时间会随着样本数量的增加而非线性增加?或者问题出在其他地方?
谢谢!
如果是XML解析器,您可以尝试另一种方法,例如
float[,] data = new Float[200,64];
int row = 0, col = 0;
var tags = XElement.Parse(file).XPathSelectElements("descriptor|feature");
foreach(var node in tags)
{
if (node.Name == "descriptor")
{ row++; col = 0; }
else if (node.Name == "feature")
{ data[row, col++] = (float)node; }
}
你们有异常处理吗?
表达式:else if (reader.Name == "descriptor") i++;
必须导致递增 i
以及开始元素 descriptor
,作为结束元素。
在我的测试代码中,这会导致 IndexOutOfRangeException。
也许您的代码挂在异常处理上?
试试这个:else if (reader.NodeType == XmlNodeType.Element && reader.Name == "descriptor") i++;
另外,我还可以提供两种方式。
使用NameTable。这可能会提高性能。不过189 * 64的节点数并不是很大。差异几乎可以忽略不计。
NameTable nt = new NameTable();
object feature = nt.Add("feature");
object descriptor = nt.Add("descriptor");
var settings = new XmlReaderSettings();
settings.NameTable = nt;
using (var reader = XmlReader.Create("descriptors.xml", settings))
{
int i = -1;
int ii = 0;
while (reader.Read())
{
if (object.ReferenceEquals(feature, reader.Name))
{
ObjectDescriptors[i, ii] = reader.ReadElementContentAsFloat();
ii++;
if (ii == 64) ii = 0;
}
else if (reader.NodeType == XmlNodeType.Element && object.ReferenceEquals(descriptor, reader.Name)) i++;
}
}
另一种方式:
using (var reader = XmlReader.Create("descriptors.xml"))
{
while (reader.Read())
{
if (reader.ReadToFollowing("descriptor"))
{
int i = -1;
do
{
i++;
if (reader.ReadToFollowing("feature"))
{
int ii = 0;
do
{
ObjectDescriptors[i, ii] = reader.ReadElementContentAsFloat();
ii++;
} while (reader.ReadToNextSibling("feature"));
}
} while (reader.ReadToNextSibling("descriptor"));
}
}
}
我使用了你从 -1 开始的丑陋索引。
另请注意,很久以前不推荐使用XmlTextReader。使用 XmlReader.Create.
创建 reader
PS: что ж ты на русском не спросил? пришлось долго словарь и переводчик мучить.
我的 C# 代码使 VisualStudio (2013) 在使用整个 XML 文件时没有响应(189 个描述符,每个描述符有 64 个特征),但少量运行良好
Matrix<float> ObjectDescriptors = new Matrix<float>(200, 64);
XmlTextReader reader = new XmlTextReader("descriptors.xml");
int i = -1;
int ii = 0;
while (reader.Read())
{
if (reader.Name == "feature" && ii < 64)
{
ObjectDescriptors[i, ii] = reader.ReadElementContentAsFloat();
ii++;
if (ii == 64) ii = 0;
}
else if (reader.Name == "descriptor") i++;
}
XML 数据干净。有谁知道为什么时间会随着样本数量的增加而非线性增加?或者问题出在其他地方?
谢谢!
如果是XML解析器,您可以尝试另一种方法,例如
float[,] data = new Float[200,64];
int row = 0, col = 0;
var tags = XElement.Parse(file).XPathSelectElements("descriptor|feature");
foreach(var node in tags)
{
if (node.Name == "descriptor")
{ row++; col = 0; }
else if (node.Name == "feature")
{ data[row, col++] = (float)node; }
}
你们有异常处理吗?
表达式:else if (reader.Name == "descriptor") i++;
必须导致递增 i
以及开始元素 descriptor
,作为结束元素。
在我的测试代码中,这会导致 IndexOutOfRangeException。 也许您的代码挂在异常处理上?
试试这个:else if (reader.NodeType == XmlNodeType.Element && reader.Name == "descriptor") i++;
另外,我还可以提供两种方式。
使用NameTable。这可能会提高性能。不过189 * 64的节点数并不是很大。差异几乎可以忽略不计。
NameTable nt = new NameTable();
object feature = nt.Add("feature");
object descriptor = nt.Add("descriptor");
var settings = new XmlReaderSettings();
settings.NameTable = nt;
using (var reader = XmlReader.Create("descriptors.xml", settings))
{
int i = -1;
int ii = 0;
while (reader.Read())
{
if (object.ReferenceEquals(feature, reader.Name))
{
ObjectDescriptors[i, ii] = reader.ReadElementContentAsFloat();
ii++;
if (ii == 64) ii = 0;
}
else if (reader.NodeType == XmlNodeType.Element && object.ReferenceEquals(descriptor, reader.Name)) i++;
}
}
另一种方式:
using (var reader = XmlReader.Create("descriptors.xml"))
{
while (reader.Read())
{
if (reader.ReadToFollowing("descriptor"))
{
int i = -1;
do
{
i++;
if (reader.ReadToFollowing("feature"))
{
int ii = 0;
do
{
ObjectDescriptors[i, ii] = reader.ReadElementContentAsFloat();
ii++;
} while (reader.ReadToNextSibling("feature"));
}
} while (reader.ReadToNextSibling("descriptor"));
}
}
}
我使用了你从 -1 开始的丑陋索引。
另请注意,很久以前不推荐使用XmlTextReader。使用 XmlReader.Create.
创建 readerPS: что ж ты на русском не спросил? пришлось долго словарь и переводчик мучить.