需要帮助调试c#XML解析

时间:2015-06-30 06:51:03

标签: c# xml 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数据很干净。有没有人想到为什么时间在样本数量增加时非线性增加?或问题出在其他地方?

谢谢!

2 个答案:

答案 0 :(得分:0)

如果是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; }
}

答案 1 :(得分:0)

你有任何异常处理吗?

表达式: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创建阅读器。

PS:чтожтынарусскомнеспросил? пришлосьдолгословарьипереводчикмучить。