1

我对 XMLReader/XMLTextReader 类有一个非常奇怪的问题。

我有一个简单的文件加载:

public void First()
{
    XmlTextReader reader = new XmlTextReader(@"C:\MyXMLFile.xml");
    XmlReader readerToSerialize;
    XmlReader readerToLoad;
    DuplicateReaders(reader, out readerToSerialize, out readerToLoad);
    XmlSerializer serializer = new XmlSerializer(typeof(XMLTree));
    XmlFeed = (XMLDescriptor)serializer.Deserialize(readerToSerialize);
    xmlDoc.Load(readerToLoad);
}
protected void DuplicateReaders(XmlTextReader xmlReader, out XmlReader cloneOne, out readerToLoad)
{
    XmlDocument _XmlDocument = new XmlDocument();
    MemoryStream _Stream = new MemoryStream();
    _XmlDocument.Load((XmlTextReader)xmlReader);
    _XmlDocument.Save(_Stream);
    _Stream.Position = 0L;
    cloneOne = XmlReader.Create(_Stream);
    _Stream.Position = 0L;
    cloneTwo = XmlReader.Create(_Stream);
}

问题是只有一个克隆元素成功读取了整个文件,下一个(xmlDoc.Load)总是在同一个地方失败(第 91 行,此 xml 文件的第 37 行字符)。如果我直接分配给 xmlDoc(即只克隆一次原始元素并直接从函数中分配它):

public void First()
{
    XmlTextReader reader = new XmlTextReader(@"C:\MyXMLFile.xml");
    XmlReader readerToSerialize;
    DuplicateReaders(reader, out readerToSerialize);
    XmlSerializer serializer = new XmlSerializer(typeof(XMLTree));
    XmlFeed = (XMLDescriptor)serializer.Deserialize(readerToSerialize);
}
protected void DuplicateReaders(XmlTextReader xmlReader, out XmlReader cloneOne)
{
    XmlDocument _XmlDocument = new XmlDocument();
    MemoryStream _Stream = new MemoryStream();
    _XmlDocument.Load((XmlTextReader)xmlReader);
    _XmlDocument.Save(_Stream);
    _Stream.Position = 0L;
    cloneOne = XmlReader.Create(_Stream);
    _Stream.Position = 0L;
    this.xmlDoc.Load(_Stream);
}

我仍然收到相同的错误 91/37(意外 EOF),但这次是在序列化程序中。

我最初的问题是,如果我使用xmlDoc.Load(reader)读取器实例会被破坏,并且以后无法对其进行序列化。我在 MSDN 论坛上找到了 Duplicate 功能,但仍然不行。我想要实现的非常简单:

仅使用一个阅读器并获得一个 XmlDocument 和一个序列化类。它能有多难?

4

3 回答 3

1

您需要先关闭第一个阅读器,然后才能使用副本。

reader.Close()
于 2012-07-19T16:58:42.043 回答
1

您的 cloneOne 和 cloneTwo 都使用相同的底层内存流。

使用不同的 MemoryStream

cloneTwo = XmlReader.Create(new MemoryStream(_Stream.ToArray()));
于 2012-07-19T18:00:27.907 回答
0

找到了更简单的解决方案,而不是克隆两个阅读器,我只是使用从 XmlDoc 创建第二个阅读器并使用它来反序列化。

于 2012-07-19T18:04:01.370 回答