我对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行,第37行使用此xml文件)。如果我直接分配给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),但这次是在Serializer中。
我最初的问题是,如果我使用xmlDoc.Load(reader)
,读者实例会被销毁,我以后就无法对其进行序列化。我在MSDN论坛上找到了Duplicate功能,但它还是不行。我想要实现的很简单:
只使用一个阅读器并获得一个XmlDocument和一个序列化类。这有多难?
答案 0 :(得分:1)
您需要关闭第一个阅读器才能使用副本。
reader.Close()
答案 1 :(得分:1)
您的cloneOne和cloneTwo都使用相同的底层内存流。
使用不同的MemoryStream
cloneTwo = XmlReader.Create(new MemoryStream(_Stream.ToArray()));
答案 2 :(得分:0)
找到了更简单的解决方案,而不是克隆两个读者,我只是使用从XmlDoc创建第二个并使用它来反序列化。