简体   繁体   English

在调试C#XML解析时需要帮助

[英]need help on debug c# XML-parsing

my c# code makes VisualStudio (2013) not respond while using the whole XMLfile (189 descriptors having 64 features each), but on a small amount works well 我的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++;
        }

The XML data is clean. XML数据是干净的。 Has anyone ideas why the time increases non linearly while the samples number increases? 有谁知道为什么时间随着样本数量的增加而非线性增加? Or the problem is elsewhere? 还是问题出在其他地方?

Thank you! 谢谢!

If it is the XML parser, you may try another approach such as 如果它是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; }
}

Do you have any exception handling? 你有异常处理吗?

Expression: else if (reader.Name == "descriptor") i++; 表达式: else if (reader.Name == "descriptor") i++; must lead to increment i as well start element descriptor , as end element. 必须导致递增i以及作为结束元素的开始元素descriptor

In my test code, this leads to IndexOutOfRangeException. 在我的测试代码中,这导致IndexOutOfRangeException。 Perhaps your code hangs on exception handling? 也许您的代码挂在异常处理上?

Try this: else if (reader.NodeType == XmlNodeType.Element && reader.Name == "descriptor") i++; 试试这个: else if (reader.NodeType == XmlNodeType.Element && reader.Name == "descriptor") i++;

Moreover, I can offer two more ways. 此外,我还可以提供两种方法。

Use NameTable . 使用NameTable This may improve performance. 这样可以提高性能。 However, the number of nodes 189 * 64 is not very large. 但是,节点189 * 64的数量不是很大。 The difference is almost negligible. 差异几乎可以忽略不计。

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++;
    }
}

Another way: 其他方式:

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"));
        }
    }
}

I used your ugly indexing starting on -1. 我使用了从-1开始的难看索引。

Also note that XmlTextReader is not recommended long ago. 另请注意,不建议在不久之前使用XmlTextReader。 Create reader using XmlReader.Create. 使用XmlReader.Create创建阅读器。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM