我正在用C#构建一个类库,该类库使用XmlTextWriter类来构建XML,然后将其导出为HTML文档。
但是当我使用XmlTextWriter对象作为内容保存带有.html扩展名的文件时,结果文件仅包含文本“ System.Xml.XmlTextWriter”
这在下面定义的方法中出现,特别是在最后一行:-
public void SaveAsHTML(string filepath)
{
XmlTextWriter html;
html = new XmlTextWriter(@"D:/HTMLWriter/XML/HTMLSaveAsConfig.xml", System.Text.Encoding.UTF8);
html.WriteStartDocument();
html.WriteStartElement("html");
html.WriteRaw(Convert.ToString(Head));
html.WriteRaw(Convert.ToString(Body));
html.WriteEndElement();
html.WriteEndDocument();
html.Flush();
html.Close();
System.IO.File.WriteAllText(filepath, html.ToString());
}
对于上下文,变量Head和Body也是XmlTextWriter对象,它们分别包含将成为html文件的和元素。
我尝试使用Convert.ToString(),这会导致相同的问题。
我很想尝试为我的类覆盖ToString()方法作为修复,可能使用XmlSerializer类。但是,我想知道是否有一种较小的方法来将Xml对象作为字符串返回?
以下函数将从您已创建为System.Xml.XmlTextWriter
和System.Xml.XmlTextWriter
的Head
对象中提取字符串。
Body
这里有一些警告,与private string XmlTextWriterToString(XmlTextWriter writer)
{
// Ensure underlying stream is flushed.
writer.Flush();
// Reset position to beginning of stream.
writer.BaseStream.Position = 0;
using (var reader = new StreamReader(writer.BaseStream))
{
// Read and return content of stream as a single string
var result = reader.ReadToEnd();
return result;
}
}
关联的基础System.IO.Stream
对象必须同时支持'read'和'seek'操作(即System.IO.Stream
和System.Xml.XmlTextWriter
属性必须分别返回System.Xml.XmlTextWriter
) 。
我对您的原始代码进行了以下编辑:
Stream.CanRead
调用。Stream.CanRead
()函数的System.CanSeek
参数指定的文件而不是硬编码的路径写入。System.CanSeek
的创建(以及使用和处置)包装在true
块中(如果您不熟悉,请参见Convert.ToString
())。下面是您的代码进行了这些更改。
Convert.ToString
[还有另一件事要注意的是,filepath
和SaveAsHTML
的生存期受到相同的基于异常的资源泄漏的可能性,与[ C0]在将其包装在System.Xml.XmlTextWriter
块中之前。
最终的思考:System.Xml.XmlTextWriter
的页面记录了以下内容:从.NET Framework 2.0开始,我们建议您使用XmlWriter.Create方法和XmlWriterSettings类来创建XmlWriter实例,以利用新功能。
最后一行写入XmlTextWriter.ToString()的值,该值不返回您编写的XML的文本表示形式。尝试省略最后一行,看起来您的XmlTextWriter已经在写入文件。
@@ PhilBrubaker的解决方案似乎在正确的轨道上。我的代码中仍然有一些错误正在努力解决,但是好消息是,强制转换似乎现在正在起作用。
using
我已经从XmlWriter更改了输入参数的类型,并在方法中将其显式转换为XmlTextWriter,这样一来,当使用Create()方法代替针对.NET 2.0的初始化时,该方法也可以使用。由于XmlWriter并不总是正确地转换为XmlTextWriter(取决于功能),目前还不是100%可靠的,但这超出了此线程的范围,我将对此进行单独研究。
感谢您的帮助!
在旁注中,using块是我以前从未遇到过的东西,但是它为我提供了许多全面的解决方案。所以也谢谢你!