将XmlTextWriter对象解析为字符串

问题描述 投票:1回答:3

我正在用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对象作为字符串返回?

c# xml tostring xmlwriter
3个回答
1
投票

以下函数将从您已创建为System.Xml.XmlTextWriterSystem.Xml.XmlTextWriterHead对象中提取字符串。

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.StreamSystem.Xml.XmlTextWriter属性必须分别返回System.Xml.XmlTextWriter) 。

我对您的原始代码进行了以下编辑:

  1. 用此新功能的调用替换了Stream.CanRead调用。
  2. 假设您打算将Stream.CanRead()函数的System.CanSeek参数指定的文件而不是硬编码的路径写入。
  3. System.CanSeek的创建(以及使用和处置)包装在true块中(如果您不熟悉,请参见Convert.ToString())。

下面是您的代码进行了这些更改。

Convert.ToString

[还有另一件事要注意的是,filepathSaveAsHTML的生存期受到相同的基于异常的资源泄漏的可能性,与[ C0]在将其包装在System.Xml.XmlTextWriter块中之前。

最终的思考:System.Xml.XmlTextWriter的页面记录了以下内容:从.NET Framework 2.0开始,我们建议您使用XmlWriter.Create方法和XmlWriterSettings类来创建XmlWriter实例,以利用新功能。


0
投票

最后一行写入XmlTextWriter.ToString()的值,该值不返回您编写的XML的文本表示形式。尝试省略最后一行,看起来您的XmlTextWriter已经在写入文件。


0
投票

@@ PhilBrubaker的解决方案似乎在正确的轨道上。我的代码中仍然有一些错误正在努力解决,但是好消息是,强制转换似乎现在正在起作用。

using

我已经从XmlWriter更改了输入参数的类型,并在方法中将其显式转换为XmlTextWriter,这样一来,当使用Create()方法代替针对.NET 2.0的初始化时,该方法也可以使用。由于XmlWriter并不总是正确地转换为XmlTextWriter(取决于功能),目前还不是100%可靠的,但这超出了此线程的范围,我将对此进行单独研究。

感谢您的帮助!

在旁注中,using块是我以前从未遇到过的东西,但是它为我提供了许多全面的解决方案。所以也谢谢你!

© www.soinside.com 2019 - 2024. All rights reserved.