Что лучший способ состоит в том, чтобы проанализировать (большой) XML в Коде C#?

Вот код, который я сделал, и он работает, НО только для НЕКОТОРЫХ случаев, а не ВСЕ

Возможно, это потому, что вы сравниваете значения, а не индексы: if (i == 0) и if (values[i] == values[values.length-1]) должны быть if (i == values.length - 1).

А фрагмент кода с меньшим количеством кода и нулевой проверки может выглядеть следующим образом

public static int[] sumNeighbours(int[] input) {
    if (input == null) {
        return null;
    }

    int[] result = new int[input.length];
    for (int i = 0; i < input.length; i++) {
        int sum = input[i];

        if (i > 0) {
            sum += input[i - 1];
        }
        if (i < (input.length - 1)) {
            sum += input[i + 1];
        }

        result[i] = sum;
    }

    return result;
}
59
задан John Saunders 26 July 2009 в 16:32
поделиться

4 ответа

Использовать XmlReader проанализировать большие XML-документы. XmlReader обеспечивает быстро, передайте только, некэшируемый доступ к данным XML. (Передайте только средства, Вы можете считать XML-файл с начала до конца, но не можете переместиться назад в файл.) XmlReader использует небольшие объемы памяти и эквивалентен использованию простого читателя SAX.

    using (XmlReader myReader = XmlReader.Create(@"c:\data\coords.xml"))
    {
        while (myReader.Read())
        {
           // Process each node (myReader.Value) here
           // ...
        }
    }

Можно использовать XmlReader для обработки файлов, которые составляют до 2 гигабайтов (ГБ) в размере.

Касательно: Как считать XML из файла при помощи Визуального C#

63
ответ дан John Saunders 24 November 2019 в 18:25
поделиться

Только, чтобы суммировать, и сделать ответ немного более очевидным для любого, кто находит этот поток в Google.

До.NET 2 XmlTextReader был большей частью памяти эффективный синтаксический анализатор XML, доступный в стандартном API (спасибо Mitch;-)

.NET 2 представила класс XmlReader, который лучше снова, Это вперед только итератор элемента (немного как синтаксический анализатор StAX). (спасибо Cerebrus;-)

И помните, что деточки, любого экземпляра XML имеет потенциал, чтобы быть больше, чем о 500k, не ИСПОЛЬЗУЙТЕ DOM!

Аплодисменты все. Keith.

12
ответ дан corlettk 24 November 2019 в 18:25
поделиться

Синтаксический анализатор SAX мог бы быть тем, что Вы ищете. SAX не требует, чтобы Вы прочитали весь документ в память - это анализирует через него инкрементно и позволяет Вам обрабатывать элементы, когда Вы идете. Я не знаю, существует ли синтаксический анализатор SAX, предоставленный в.NET, но существует несколько опций с открытым исходным кодом, на которые Вы могли посмотреть:

Вот связанное сообщение:

6
ответ дан Community 24 November 2019 в 18:25
поделиться

Asat 14 мая 2009 г .: Я перешел на гибридный подход ... см. Код ниже.

Эта версия имеет большинство преимуществ обоих:
* XmlReader / XmlTextReader (эффективность памяти -> скорость); и
* XmlSerializer (code-gen -> оперативность и гибкость разработки).

Он использует XmlTextReader для итерации по документу и создает «доклеты», которые десериализует с помощью классов XmlSerializer и «привязки XML», сгенерированных с помощью XSD.EXE.

Я полагаю, что этот рецепт универсален и быстро ... Я разбираю XML-документ размером 201 МБ, содержащий 56000 функций GML, примерно за 7 секунд ... старая реализация этого приложения на VB6 занимала минуты (или даже часы), чтобы проанализировать большие фрагменты ... так что я смотрю ' хорошо.

Еще раз, БОЛЬШОЕ Спасибо форумчанам за то, что пожертвовали свое драгоценное время. Я очень ценю это.

Всем привет. Кейт.

using System;
using System.Reflection;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.Collections.Generic;

using nrw_rime_extract.utils;
using nrw_rime_extract.xml.generated_bindings;

namespace nrw_rime_extract.xml
{
    internal interface ExtractXmlReader
    {
        rimeType read(string xmlFilename);
    }

    /// <summary>
    /// RimeExtractXml provides bindings to the RIME Extract XML as defined by
    /// $/Release 2.7/Documentation/Technical/SCHEMA and DTDs/nrw-rime-extract.xsd
    /// </summary>
    internal class ExtractXmlReader_XmlSerializerImpl : ExtractXmlReader
    {
        private Log log = Log.getInstance();

        public rimeType read(string xmlFilename)
        {
            log.write(
                string.Format(
                    "DEBUG: ExtractXmlReader_XmlSerializerImpl.read({0})",
                    xmlFilename));
            using (Stream stream = new FileStream(xmlFilename, FileMode.Open))
            {
                return read(stream);
            }
        }

        internal rimeType read(Stream xmlInputStream)
        {
            // create an instance of the XmlSerializer class, 
            // specifying the type of object to be deserialized.
            XmlSerializer serializer = new XmlSerializer(typeof(rimeType));
            serializer.UnknownNode += new XmlNodeEventHandler(handleUnknownNode);
            serializer.UnknownAttribute += 
                new XmlAttributeEventHandler(handleUnknownAttribute);
            // use the Deserialize method to restore the object's state
            // with data from the XML document.
            return (rimeType)serializer.Deserialize(xmlInputStream);
        }

        protected void handleUnknownNode(object sender, XmlNodeEventArgs e)
        {
            log.write(
                string.Format(
                    "XML_ERROR: Unknown Node at line {0} position {1} : {2}\t{3}",
                    e.LineNumber, e.LinePosition, e.Name, e.Text));
        }

        protected void handleUnknownAttribute(object sender, XmlAttributeEventArgs e)
        {
            log.write(
                string.Format(
                    "XML_ERROR: Unknown Attribute at line {0} position {1} : {2}='{3}'",
                    e.LineNumber, e.LinePosition, e.Attr.Name, e.Attr.Value));
        }

    }

    /// <summary>
    /// xtractXmlReader provides bindings to the extract.xml 
    /// returned by the RIME server; as defined by:
    ///   $/Release X/Documentation/Technical/SCHEMA and 
    /// DTDs/nrw-rime-extract.xsd
    /// </summary>
    internal class ExtractXmlReader_XmlTextReaderXmlSerializerHybridImpl :
        ExtractXmlReader
    {
        private Log log = Log.getInstance();

        public rimeType read(string xmlFilename)
        {
            log.write(
                string.Format(
                    "DEBUG: ExtractXmlReader_XmlTextReaderXmlSerializerHybridImpl." +
                    "read({0})",
                    xmlFilename));

            using (XmlReader reader = XmlReader.Create(xmlFilename))
            {
                return read(reader);
            }

        }

        public rimeType read(XmlReader reader)
        {
            rimeType result = new rimeType();
            // a deserializer for featureClass, feature, etc, "doclets"
            Dictionary<Type, XmlSerializer> serializers = 
                new Dictionary<Type, XmlSerializer>();
            serializers.Add(typeof(featureClassType), 
                newSerializer(typeof(featureClassType)));
            serializers.Add(typeof(featureType), 
                newSerializer(typeof(featureType)));

            List<featureClassType> featureClasses = new List<featureClassType>();
            List<featureType> features = new List<featureType>();
            while (!reader.EOF)
            {
                if (reader.MoveToContent() != XmlNodeType.Element)
                {
                    reader.Read(); // skip non-element-nodes and unknown-elements.
                    continue;
                }

                // skip junk nodes.
                if (reader.Name.Equals("featureClass"))
                {
                    using (
                        StringReader elementReader =
                            new StringReader(reader.ReadOuterXml()))
                    {
                        XmlSerializer deserializer =
                            serializers[typeof (featureClassType)];
                        featureClasses.Add(
                            (featureClassType)
                            deserializer.Deserialize(elementReader));
                    }
                    continue;
                    // ReadOuterXml advances the reader, so don't read again.
                }

                if (reader.Name.Equals("feature"))
                {
                    using (
                        StringReader elementReader =
                            new StringReader(reader.ReadOuterXml()))
                    {
                        XmlSerializer deserializer =
                            serializers[typeof (featureType)];
                        features.Add(
                            (featureType)
                            deserializer.Deserialize(elementReader));
                    }
                    continue;
                    // ReadOuterXml advances the reader, so don't read again.
                }

                log.write(
                    "WARNING: unknown element '" + reader.Name +
                    "' was skipped during parsing.");
                reader.Read(); // skip non-element-nodes and unknown-elements.
            }
            result.featureClasses = featureClasses.ToArray();
            result.features = features.ToArray();
            return result;
        }

        private XmlSerializer newSerializer(Type elementType)
        {
            XmlSerializer serializer = new XmlSerializer(elementType);
            serializer.UnknownNode += new XmlNodeEventHandler(handleUnknownNode);
            serializer.UnknownAttribute += 
                new XmlAttributeEventHandler(handleUnknownAttribute);
            return serializer;
        }

        protected void handleUnknownNode(object sender, XmlNodeEventArgs e)
        {
            log.write(
                string.Format(
                    "XML_ERROR: Unknown Node at line {0} position {1} : {2}\t{3}",
                    e.LineNumber, e.LinePosition, e.Name, e.Text));
        }

        protected void handleUnknownAttribute(object sender, XmlAttributeEventArgs e)
        {
            log.write(
                string.Format(
                    "XML_ERROR: Unknown Attribute at line {0} position {1} : {2}='{3}'",
                    e.LineNumber, e.LinePosition, e.Attr.Name, e.Attr.Value));
        }
    }
}
16
ответ дан 24 November 2019 в 18:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: