Разделить один xml-файл на несколько с помощью c # [duplicate]

Вы можете прокручивать массив, распечатывая каждый элемент, когда вы выполняете цикл. Например:

String[] items = {"item 1", "item 2", "item 3"};

for(int i = 0; i < items.length; i++) {

    System.out.println(items[i]);

}

Выход:

item 1
item 2
item 3
2
задан Martijn Burger 23 February 2013 в 12:20
поделиться

2 ответа

Несмотря на то, что XmlReader можно сделать для чтения данных с использованием опции ConformanceLevel.Fragment, как показано Martijn, кажется, что XmlDataDocument не нравится идея иметь несколько корневых элементов.

Я думал, что попробую другой подход, похожий на тот, который вы сейчас используете, но без промежуточного файла. Большинство библиотек XML (XmlDocument, XDocument, XmlDataDocument) могут принимать TextReader в качестве ввода, поэтому я реализовал один из своих. Он используется так:

var dataDocument = new XmlDataDocument();
dataDocument.Load(new FakeRootStreamReader(File.OpenRead("test.xml")));

Код действительного класса:

public class FakeRootStreamReader : TextReader
{
    private static readonly char[] _rootStart;
    private static readonly char[] _rootEnd;

    private readonly TextReader _innerReader;
    private int _charsRead;
    private bool _eof;

    static FakeRootStreamReader()
    {
        _rootStart = "<root>".ToCharArray();
        _rootEnd = "</root>".ToCharArray();
    }

    public FakeRootStreamReader(Stream stream)
    {
        _innerReader = new StreamReader(stream);
    }

    public FakeRootStreamReader(TextReader innerReader)
    {
        _innerReader = innerReader;
    }

    public override int Read(char[] buffer, int index, int count)
    {
        if (!_eof && _charsRead < _rootStart.Length)
        {
            // Prepend root element
            return ReadFake(_rootStart, buffer, index, count);
        }

        if (!_eof)
        {
            // Normal reading operation
            int charsRead = _innerReader.Read(buffer, index, count);
            if (charsRead > 0) return charsRead;

            // We've reached the end of the Stream
            _eof = true;
            _charsRead = 0;
        }

        // Append root element end tag at the end of the Stream
        return ReadFake(_rootEnd, buffer, index, count);
    }

    private int ReadFake(char[] source, char[] buffer, int offset, int count)
    {
        int length = Math.Min(source.Length - _charsRead, count);
        Array.Copy(source, _charsRead, buffer, offset, length);
        _charsRead += length;
        return length;
    }
}

Первый вызов Read(...) вернет только элемент <root>. Последующие вызовы читают поток как обычно, до тех пор, пока не будет достигнут конец потока, тогда будет выведен конечный тег.

Код немного ... meh ... в основном потому, что я хотел обрабатывать некоторые никогда не случается, когда кто-то пытается читать поток менее 6 символов за раз.

2
ответ дан Thorarin 24 August 2018 в 01:10
поделиться

Это работает:

using System.Diagnostics;
using System.Xml;

namespace XmlExample
{
    class Program
    {
        static void Main(string[] args)
        {
            string file = @"C:\test.txt";
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.ConformanceLevel = ConformanceLevel.Fragment;
            using (XmlReader reader = XmlReader.Create(file, settings))
            {
                while (reader.Read())
                    Debug.WriteLine("NodeType: {0} NodeName: {1}", reader.NodeType, reader.Name);
            }
        }
    }
}
3
ответ дан Martijn Burger 24 August 2018 в 01:10
поделиться
Другие вопросы по тегам:

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