Вы можете прокручивать массив, распечатывая каждый элемент, когда вы выполняете цикл. Например:
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
Несмотря на то, что 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 символов за раз.
Это работает:
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);
}
}
}
}